如何在 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)
当字符串在我的文本文件中跨越两行时,我无法尝试使用正则表达式搜索字符串。我一直在 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)