Python 正则表达式模式的新手。如何捕获多行?

Python 正则表达式模式的新手。如何捕获多行?,python,regex,Python,Regex,我对正则表达式模式很陌生。我很难解析文本文件并返回每个段落的匹配项。所以基本上每个段落都是独一无二的 这是我的示例文本文件 A quick brown fox jumps over the lazy dog; 1234; Here is the second paragraph 123141 我希望is匹配项[0]为: #快速棕色 狐狸跳了过去 懒惰的狗; 1234; 将[1]匹配为: #这是 第二段 123141 我试过了 regex = re.compile(r"(.*\n)\

我对正则表达式模式很陌生。我很难解析文本文件并返回每个段落的匹配项。所以基本上每个段落都是独一无二的

这是我的示例文本文件

A quick brown
fox jumps over
the lazy dog;
1234;

Here is
the second paragraph
123141
我希望is匹配项[0]为: #快速棕色 狐狸跳了过去 懒惰的狗; 1234;

将[1]匹配为: #这是 第二段 123141

我试过了

regex = re.compile(r"(.*\n)\n", re.MULTILINE)
   with open(file_dir, "r") as file:
      matches = regex.findall(file.read())
print matches
但是结果是['1234;\n']。它没有抓住整段,也没有抓住第二段。最有效的方法是什么?

这是一个良好的开端:

(?:.+\s)+
测试一下

测试代码:

import re

regex = r"(?:.+\s)+"

test_str = ("A quick brown\n"
    "fox jumps over\n"
    "the lazy dog;\n"
    "1234;\n\n"
    "Here is\n"
    "the second paragraph\n"
    "123141")

matches = re.finditer(regex, test_str, re.MULTILINE)

for matchNum, match in enumerate(matches, start=1):
    
    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))
    
    for groupNum in range(0, len(match.groups())):
        groupNum = groupNum + 1
        
        print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))
输出:

Match 1 was found at 0-49: A quick brown
fox jumps over
the lazy dog;
1234;

Match 2 was found at 50-79: Here is
the second paragraph
您可以看到最后一段的最后一行被截断。为了避免这种情况,在匹配正则表达式之前,请在字符串末尾添加一个
\n
,以便正则表达式可以检测段落的结尾:
test\u str+='\n'

您可以在结尾不使用
\n
的情况下试用它。

试用
(\S[\S\S]*?)(?:\n\n$)

  • \S
    匹配非空白字符
  • [\s\s]*?
    匹配0个或多个空白或非空白字符,即包括换行符在内的任何类型的字符。项目1和2在捕获组1中
  • (?:\n\n |$)
    匹配非捕获组中的两个连续换行符或$(匹配字符串结尾或字符串结尾前的换行符)
  • 守则:

    import re
    
    s = """A quick brown
    fox jumps over
    the lazy dog;
    1234;
    
    Here is
    the second paragraph
    123141"""
    
    matches = re.findall(r'(\S[\s\S]*?)(?:\n\n|$)', s)
    print(matches)
    
    印刷品:

    ['A quick brown\nfox jumps over\nthe lazy dog;\n1234;', 'Here is\nthe second paragraph\n123141']
    
    或者,您可以使用:

    \S(?:(?!\n\n)[\s\S])*
    
    它使用了一个否定的looahead断言,其成本与以前的正则表达式大致相同。这个正则表达式首先查找一个非空白字符,然后只要以下输入流不包含两个连续的换行符,它就会继续扫描一个以上的字符


    看看你到底想要什么?所以基本上每个段落都是唯一的,是分隔符吗?请提供一个更通用的输入文件详细信息,无需注释。不,代码是从中生成的,我用它来创建正则表达式示例和python代码。转到“生成的代码”部分,您可以访问多种编程语言,可以在tio上测试。谢谢分享。我想我之所以很难创建正则表达式,是因为使用了多行函数。虽然您的第二个答案在multiline中也很有效。您可以在第二个正则表达式版本中使用multiline,但这与此无关,因为模式中没有使用
    ^
    $
    ,这正是re.multiline所影响的。在第一个regex
    re.MULTILINE
    中肯定是一个错误。