Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中使用正则表达式搜索跨行的字符串_Python_Regex_Newline - Fatal编程技术网

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

如何在python中使用正则表达式搜索跨行的字符串,python,regex,newline,Python,Regex,Newline,当字符串跨越文本文件中的两行时,我无法使用正则表达式搜索字符串。我找了很久了。我已经试过regex\s和DOTALL以及其他东西一段时间了 问题似乎是我在一行接一行地迭代,在我看来,这是处理大型文件的正确方法。我明白了,一行接一行地看不到下一行的内容,但我认为正则表达式中会有一个标志可以使用。我似乎找不到相关的标志 我也尝试过各种各样的if-then,可以说,来处理环顾四周的问题。但首先,这看起来不像是pythonic,其次,我不断出现错误,比如无法连接字符串和列表。这样做会变得越来越复杂 这是

当字符串跨越文本文件中的两行时,我无法使用正则表达式搜索字符串。我找了很久了。我已经试过regex\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帮助chaz新品chaz 56你看

为使伸缩臂40在船舶中展开后保持其最终伸展状态,可使用单向插销锁定相邻节段42。图5显示了一个可能的插销44,位于第一位置,用于锁定伸缩臂40。插销44可包括一个或多个与第一节段48和齿50相关的槽46与第二相邻节段52相关。当伸缩臂40展开时,第二节段52相对于第一节段48沿第一方向a移动。齿50和凹槽46对齐,以便在伸缩臂40展开时接合。一旦齿50接合凹槽46,如图6所示,第二节段t 52不能相对于第一段48沿第二方向B移动。因此,伸缩臂40可以自由延伸,但一旦延伸就不会塌陷。当然,也可以使用其他单向闩锁来锁定伸缩臂40的段42。图7示出了伸缩臂40的段42的一个可能横截面这种“轨道”设计允许在图4所示的段42之间滑动和定位单向插销,如图5所示。”

  • ptnt_txt:中的语句
    将输入拆分为换行和换行
    逐行处理。那么就不能跨行执行正则表达式。
    使用
    ptnt\u 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', ' '))

以下是我根据@tshioo得出的结论和第一条让人大开眼界的评论:

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)

没有任何正则表达式标志可以帮助您在未输入正则表达式引擎多行文本块的行之间进行匹配。没有奇迹。将文本作为单个变量读入,或使用特定逻辑进行解析,不一定是regex.Yeah。在模式匹配之前,最好用空格替换换行符。顺便说一句,我们不需要指定
re.M
标志,因为它只是更改
^
$
锚的行为。