我正在尝试匹配许可证文件中的文本,并且在找到下一个匹配项时,我仍然不知道如何停止匹配任何文本。
我的文字如下:
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<.*>)((.|\n)*)
要匹配以下所有字符和换行符,它只会捕获第一个组,然后只捕获所有文本。
我希望将包名称作为一个组匹配,并将下一个包名称之前的所有内容作为第二个组匹配。
答案 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
- 字符串的结尾。