多行正则表达式匹配,直到找到下一组

时间:2018-04-05 18:50:29

标签: regex

我正在尝试匹配许可证文件中的文本,并且在找到下一个匹配项时,我仍然不知道如何停止匹配任何文本。

我的文字如下:

packagename
1.0.5 <https://github.com/user/packagename>

Lots of text
here
across multiple lines

packagename2
1.1.0 <https://github.com/user/packagename2>

lots more text here
this continues for a while
across many lines

要查找每个匹配应该从哪里开始,我使用以下正则表达式:

(\w+\n\d+\.\d+\.\d+\s<.*>)

这正确地匹配了我的所有标题,但是当我尝试使用时:

(\w+\n\d+\.\d+\.\d+\s<.*>)((.|\n)*)

要匹配以下所有字符和换行符,它只会捕获第一个组,然后只捕获所有文本。

我希望将包名称作为一个组匹配,并将下一个包名称之前的所有内容作为第二个组匹配。

1 个答案:

答案 0 :(得分:1)

您可以使用

(?m)^(\w+\n\d+(?:\.\d+){2}\s+<.*>)([\s\S]*?)(?=[\n\r]+\w+\n\d+(?:\.\d+){2}\s<|\Z)

在Python中,

results = re.findall(r'^(\w+\n\d+(?:\.\d+){2}\s+<.*>)([\s\S]*?)(?=[\n\r]+\w+\n\d+(?:\.\d+){2}\s<|\Z)', re.M)

请参阅regex demo

<强>详情

  • ^ - 该行的开头(由于re.M修饰符,^除了字符串的开头之外还匹配行开头)
  • (\w+\n\d+(?:\.\d+){2}\s+<.*>) - 第1组:
    • \w+ - 1 + word chars
    • \n - 换行符
    • \d+ - 1+位数
    • (?:\.\d+){2} - 重复.和1+位
    • \s+ - 1+空格
    • <.*> - <,以及尽可能多的换行以外的0 +字符>
  • ([\s\S]*?) - 第2组:任何0+字符,尽可能少,直至最左边的...
  • (?=[\n\r]+\w+\n\d+(?:\.\d+){2}\s<|\Z) - 匹配的正向前瞻,不添加匹配值
    • [\n\r]+ - 1+换行符后跟
    • \w+\n\d+(?:\.\d+){2}\s< - 第1组模式(几乎所有模式,你可以在这里添加所有模式,但似乎<就足够了)
  • | - 或
  • \Z - 字符串的结尾。