我正在尝试修改我工作的正则表达式(我正在使用Python 3.6)来处理我的测试数据。你可以看看例如
str =“<@@@@ 2018年7月2日Idustry.Lorem Ipsum自16世纪以来一直是业界标准的虚拟文本,当时一个未知的打印机拿了一个类型的厨房并乱扰它制作一个类型的标本书。它幸存下来仅仅五个世纪,也是电子版@@@@@@ c排版的跳跃,>基本保持不变。它在20世纪60年代随着包含Lorem Ipsum段落的Letraset表格的推出而普及,最近还推出了像Aldus这样的桌面出版软件PageMaker包括Lorem Ipsum的版本> <@@@@ 2019年8月1日dustry.Lorem Ipsum自从16世纪以来一直是业界标准的虚拟文本,当时一个未知的打印机拿了一个类型的厨房并乱扰它制作一个类型的样本书。它不仅存活了五个世纪,而且还延续了电子排版,>基本保持不变。它在20世纪60年代随着Letraset的发布而普及,其中包含了Lorem Ipsum段落的更多内容,以及更多的内容# #### ntly机智h桌面出版软件,如Aldus PageMaker,包括Lorem Ipsum的版本<2019年8月2日,与Aldus PageMaker等桌面出版软件一起,包括Lorem Ipsum的版本> <@@@@ 2019年8月1日dustry。自16世纪以来,Lorem Ipsum一直是业界标准的虚拟文本,当时一个未知的打印机采用了类型的厨房并且争抢####### d它来制作一个类型的标本书。它不仅存活了五个世纪,而且还延续了电子排版,>基本保持不变。它在20世纪60年代随着包含Lorem Ipsum段落的Letraset表格的推出而普及,最近还推出了像Aldus PageMaker这样的桌面出版软件,包括Lorem Ipsum版本>
您可以看到有一堆由尖括号分隔的片段,我感兴趣的每个片段都以易于识别的字符串开头,在这种情况下@@@某个日期和片段以尖括号结束,所以它就像<@@@@一些日期可能包含有角度的括号的一些文本>如下
<@@@@ 2018年7月2日Idustry。自16世纪以来,Lorem Ipsum一直是业界标准的虚拟文本,当时一台未知的打印机采用了类型的厨房,并将其拼凑成一本类型的样本。它不仅存活了五个世纪,而且还延续了电子排版,>基本保持不变。它在20世纪60年代随着包含Lorem Ipsum段落的Letraset表格的推出而普及,最近还推出了包括Lorem Ipsum版本在内的桌面出版软件Aldus PageMaker>
问题是有时日期后面的文本包含一个有角度的括号,因为正则表达式只是部分匹配。有办法防止这种情况吗?我无法成功使用负面展望。
我已经尝试了以下内容:
r"<[(?!<@date) >| (?!<@date) < | ^>]+>
换句话说,匹配任何不包含<@date(包括有角度的括号<或>)的内容(如果它们出现在文本中),也匹配任何其他字符。
pattern = re.compile(r"<[^>]+>")
return pattern.findall(str)
实际结果是它只是部分匹配,因为正则表达式只是渴望匹配文本中的第一个>或<而我希望得到整个片段包括>之后的部分,直到实际的闭合角括号和开头下一个片段(除非是最后一个片段,否则可能没有任何后续片段)。
你可以匹配一个开口括号,然后是@
的1倍以上,然后使用非贪婪的match.*?
,直到你遇到下一个<@
或字符串的结尾:
<\s*@+.*?(?=<@|$)
您的代码可能如下所示:
pattern = re.compile(r"<\s*@+.*?(?=<@|$)", re.MULTILINE)
return pattern.findall(str)
我认为你的意思的另一种方式是使用tempered greedy token:
<\s*@+(?:(?!<@+).)*>