对正则表达式的展望是否定的?急切地只匹配弗拉格曼的第一个角括号

2024-09-30 16:28:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图修改一个正则表达式(我使用的是python3.6)来处理我的测试数据。例如,你可以看到

str=“<@@@@2018年7月2日工业。从16世纪起,当一个不知名的印刷商拿起一个印刷机,把它拼凑成一本印刷样书时,Lorem Ipsum就一直是印刷业的标准虚拟文本。它不仅存活了五个世纪,而且还跨越到电子排版;基本上保持不变。它在20世纪60年代随着包含Lorem Ipsum段落的Letraset表的发布而流行,最近又随着桌面出版软件Aldus PageMaker(包括Lorem Ipsum><@@@@2019年8月1日工业。从16世纪起,当一个不知名的印刷商拿起一个印刷机,把它拼凑成一本印刷样书时,Lorem Ipsum就一直是印刷业的标准虚拟文本。它不仅存活了五个世纪,而且还跨越到电子排版,>;基本上保持不变。它在20世纪60年代随着包含Lorem Ipsum段落的Letraset she$$$$$ets的发布而流行,最近更流行的是像Aldus PageMaker这样的桌面发布软件,包括Lorem Ipsum版本<2019年8月2日世纪使用桌面发布软件,如Aldus PageMaker,包括Lorem Ipsum版本><@@@@2019年8月1日工业。从16世纪开始,Lorem Ipsum就一直是业界标准的虚拟文本,当时一位不知名的印刷商用一个排字机和一个拼字机把它拼成了一本打字样书。它不仅存活了五个世纪,而且还跨越到电子排版,>;基本上保持不变。它在20世纪60年代随着包含Lorem Ipsum段落的Letraset表的发布而流行,最近又随着桌面出版软件Aldus PageMaker(包括Lorem Ipsum>;”

您可以看到,有一堆片段用尖括号隔开,我感兴趣的每个片段都以一个易于识别的字符串开头,在本例中@@@一些日期和片段以尖括号结尾,因此类似于<;@@@@@某些日期某些文本可能包含尖括号>;如下

<@@@@2018年7月2日工业。从16世纪起,当一个不知名的印刷商拿起一个印刷机,把它拼凑成一本印刷样书时,Lorem Ipsum就一直是印刷业的标准虚拟文本。它不仅存活了五个世纪,而且还跨越到电子排版,>;基本上保持不变。它在20世纪60年代随着包含Lorem Ipsum段落的Letraset表的发布而流行,最近又随着桌面出版软件Aldus PageMaker(包括Lorem Ipsum>

问题是,有时日期后面的文本包含一个尖括号,而且由于regex是急切的,所以只能部分匹配。有没有办法防止这种情况?我没能成功地使用消极展望

我已经尝试了以下方法:

r"<[(?!<@date) >| (?!<@date) < | ^>]+>

换言之,匹配任何不跟随a的内容<@日期包括尖括号<;或>;如果它们出现在文本中,也匹配任何其他字符

 pattern = re.compile(r"<[^>]+>")
 return pattern.findall(str)

实际结果是它只部分匹配,因为正则表达式只与第一个匹配>;或<;在文本中,我想得到整个片段,包括后面的部分>;直到实际的收尾角括号和下一个片段的开始(除非是最后一个片段,否则后面可能没有任何内容)


Tags: 文本ltgt标准软件电子桌面段落
1条回答
网友
1楼 · 发布于 2024-09-30 16:28:55

您可以匹配一个左括号,后跟1+乘以@,然后使用非贪婪匹配.*?,直到遇到下一个<@或字符串的结尾:

<\s*@+.*?(?=<@|$)

Regex demo| Python demo

您的代码可能如下所示:

pattern = re.compile(r"<\s*@+.*?(?=<@|$)", re.MULTILINE)
return pattern.findall(str)

我认为你的另一个意思是使用tempered greedy token

<\s*@+(?:(?!<@+).)*>

Regex demo| Python demo

相关问题 更多 >