代码之家  ›  专栏  ›  技术社区  ›  Andre_k

提取单词和分隔符之间的单词

  •  0
  • Andre_k  · 技术社区  · 5 年前

    我从word文档(.doc)中提取了一些文本数据,并存储在一个变量中 my_text 以至于

    my_text[2] = '2 Running Hrs                         -  \tPort M/E RPM  \t-  \t'
    

    在这里 \t 是文档本身的分隔符。 我试图在一个单词的两个字母之间提取单词/字符 运行小时数 “还有” \t “一个分隔符。 这样我就能得到一个输出' - '
    我试过了

    1. 试验1

    import re
    re.search('Running Hrs(.*)\t', my_text[2].strip()).group(1)
    

    输出

     '                         -  \tPort M/E RPM  '
    
    1. 试验2

    print(re.findall(r'\Running Hrs([^]\t*)\]', str(my_text[2])))
    

    输出

    ERROR: error: bad escape \R
    

    有什么建议吗。

    0 回复  |  直到 5 年前
        1
  •  4
  •   rahlf23    5 年前

    你的第一次尝试非常接近你想要的,因为你只需要包含一个 ? 标记以确保捕获组不贪婪,如下所示:

    r'Running Hrs(.*?)\t'
    

    没有这个 ? flag,你的捕获团队被认为是贪婪的,并且会尽可能地匹配到最后一个 \t ,而非贪婪表达式只能在第一个 \t .

        2
  •  1
  •   Himanshu    5 年前

    您可以在代码中使用类似的内容

    start_phrase = 'Running Hrs'
    
    start = my_text[2].index(start_phrase)+len(start_phrase)
    end = my_text[2].index('\t')
    
    my_text[2][start:end].strip()
    
        3
  •  0
  •   jlink1988    5 年前

    您的正则表达式几乎正确,但匹配尽可能多的字符(贪婪行为)。要获得最小匹配字符,可以使用“?”将行为设置为非贪婪表示

    同时执行以下操作。提取开始模式和“/t”之间的文本后,删除剩余空格。

    my_text[2] = '2 Running Hrs                         -  \tPort M/E RPM  \t-  \t'
    
    import re
    re.search('Running Hrs(.*?)\t', my_text[2]).group(1).strip()
    

    见: https://docs.python.org/3/library/re.html

        4
  •  0
  •   The fourth bird    5 年前

    如果你愿意 - 因此,我建议在测试结果中使用strip group(1) 相反

    如果 \t 是文档本身的分隔符,并且没有其他 \t 除了末端的那个,在整条线上使用条带将移除那个,并且图案将不匹配。

    而不是使用非贪婪的 .*? 你需要一个 negated character class [^ 而是匹配除制表符或换行符之外的任何字符。

    Running Hrs([^\t\r\n]+)\t
    

    Regex demo | Python demo

    import re
    
    my_text = '2 Running Hrs                         -  \tPort M/E RPM  \t-  \t'
    print(re.search('Running Hrs([^\t\r\n]+)\t', my_text).group(1).strip())
    

    输出

    -