如何在 python 中使用正则表达式搜索跨行的字符串

How to search for string that spans a line using regex in python

当字符串在我的文本文件中跨越两行时,我无法尝试使用正则表达式搜索字符串。我一直在 Whosebug 上搜索。我已经尝试了一段时间的正则表达式 \s 和 DOTALL 以及其他东西。

问题似乎是我逐行迭代,在我看来这对大文件来说是正确的做法。而且我知道逐行查看不应该在下一行中找到一些东西,但我认为正则表达式中会有一个标志可供使用。我似乎找不到相关的标志。

我也尝试过各种 if then 来处理环顾四周,可以这么说。但首先这看起来不像 pythonic,其次我不断收到诸如无法连接字符串和列表之类的错误。这样做只会变得越来越复杂。

这是我的脚本:

captured_text = []
captured_multi_nums = []
with open('text.txt', mode='r') as ptnt_txt:
    for line in ptnt_txt:
        my_txt_pull = re.findall("[a-zA-Z]+ [a-zA-Z]+ [0-9][0-9]*", line, re.M)
        if my_txt_pull:  #captures nonempty list
            for item in my_txt_pull:
                captured_text.append(item)                
make_text_unique = (set(captured_text))
with open('patent_fig_number_output.txt', 'w') as f:
    for item in make_text_unique:
        f.write(item)
        f.write('\n')

这是我使用的 text.txt 文件,没有被捕获的是“line chaz \n56”:

"chaz help for chaz new line chaz 56你看。

为了在部署在容器中之后将伸缩臂40保持在它们的最终延伸状态,可以使用单向闩锁来锁定相邻节段42。图5示出了一种可能的闩锁44,其处于第一位置,用于锁定伸缩臂40。闩锁44可包括与第一段48相关联的一个或多个凹槽46和与相邻的第二段52相关联的齿50。当伸缩臂40展开时,第二部分52相对于第一部分48在第一方向A上移动。齿50和凹槽46对准以便在伸缩臂40伸展时接合。一旦齿 50 与凹槽 46 啮合,如图 5 所示。如图6所示,第二段52可以不相对于第一段48在第二方向B上移动。因此,伸缩臂40可以自由延伸但一旦延伸就不会收缩。当然,可以使用其他单向闩锁来锁定伸缩臂40的节段42。图7示出了伸缩臂40的一段42的一个可能的横截面。这种“轨道”设计允许单向闩锁的滑动和定位的空间,如图1所示。在图5中,在图4所示的段42之间。 4.

  • 语句for line in ptnt_txt:将输入拆分为换行符和 逐行处理。然后你不能跨行执行正则表达式。 改为使用 ptnt_txt.read() 将整个文本放入变量中。
  • 在正则表达式中 "[a-zA-Z]+ [a-zA-Z]+ [0-9][0-9]* 原子由 永远不匹配换行符的空格。尝试类似的东西: "[a-zA-Z]+\s*[a-zA-Z]+\s*[0-9][0-9]*`

然后#4 和#8 之间的行将如下所示:

    s = ptnt_txt.read()
    my_txt_pull = re.findall("[a-zA-Z]+\s+[a-zA-Z]+\s+[0-9][0-9]*", s, re.M)
    if my_txt_pull:
        for item in my_txt_pull:
            captured_text.append(item.replace('\n', ' '))

这是我根据@tshiono 和第一条令人大开眼界的评论得出的结论:

patent_file = 'test2.txt'
with open(patent_file, mode='r') as ptnt_txt:
    patent_txt = ptnt_txt.read().replace('\n', ' ')
    my_txt_pull = re.findall("[a-zA-Z]+ [a-zA-Z]+\s+[0-9][0-9]*", patent_txt, re.M)