Python 从文本文件中提取两个括号之间的文本
示例文本: “115有客观证据表明,海事组织各项强制性文书及其修正案(包括默示修正案)的国家法律的颁布受到拖延,而且缺乏既定程序和有关当局协助这一进程的承诺(1974年《海上人命安全公约》第1条;《防污公约》第1条;1966年《法律汇编》第1条;第三法典第4款;第三法典第8款;第三法典第11款)。” 我想摘录: 《1974年国际海上人命安全公约》第一条;《防污公约》第1条;《1966年国际法》第1条;第三法典第4款;第三法典第8款;第三法典第11款 我使用了re.findall(r'(*III.*)),但它返回: (包括默示修正案)受到延误,相关当局缺乏既定程序和承诺来协助这一过程(《1974年海上人命安全公约》第一条;《防污公约》第1条;《1966年国际法》第1条;第三法典第4款;第三法典第8款;第三法典第11款)Python 从文本文件中提取两个括号之间的文本,python,regex,Python,Regex,示例文本: “115有客观证据表明,海事组织各项强制性文书及其修正案(包括默示修正案)的国家法律的颁布受到拖延,而且缺乏既定程序和有关当局协助这一进程的承诺(1974年《海上人命安全公约》第1条;《防污公约》第1条;1966年《法律汇编》第1条;第三法典第4款;第三法典第8款;第三法典第11款)。” 我想摘录: 《1974年国际海上人命安全公约》第一条;《防污公约》第1条;《1966年国际法》第1条;第三法典第4款;第三法典第8款;第三法典第11款 我使用了re.findall(r'(*III.
任何想法都会让我发疯!不清楚您是否只想将括号与括号中的
III
进行匹配。在任何情况下,我都会提供包含或不包含以下检查的解决方案
在括号之间提取文本 查看正在使用的这个正则表达式 工作原理:
按字面意思匹配此字符\(
(
匹配除[^)]*
任意次数)以外的任何字符。
按字面意思匹配此字符\)
)
如果包含
III
查看正在使用的这个正则表达式
与前面的逻辑相同,只是确保III
存在(I{3}
)
演出 在第二个示例中,
I{3}
正好匹配I
三次。这比III
更有效
还有人提到,*?
可以用来替换[^]*
——虽然这是事实,但由于*?
回溯以尽可能少地匹配,因此它会带来性能成本。被否定的字符类方法仍然是贪婪的,并且防止了回溯的需要,从而使其更加有效
您可以检查此性能比较。使用
re.findall('\(.*)'),s)
如何?假设s
是包含文本的变量名。使用\([^)]*\)
-这比@user2977071建议的惰性量词方法要快-但想法相同。它总是在文本的末尾吗?@ctwheels从不知道它们有性能差异,感谢分享您的知识:)@user2977071*?
回溯,而[^]*
没有:)感谢您的回复!当我有希望解决这个问题时,我将测试答案并更新帖子。我使用了([^)]I{3}[^)],并且除了(SOLAS 1974,第1条;MARPOL,第1条;MARPOL,第6(3)条;LL 1966,第1条;吨位1969,第1条;COLREG 1972,第1条;III代码,第8段)之外,它都有效——见regex示例。似乎是第6(3)条导致了问题。当你删除时,将其更改为6(3),问题就消失了。有什么建议吗?@JohnRussell是的,没错,因为它停在)
。你的句子可以包含多少嵌套括号?在本例中,您有一个嵌套的括号。有硬限制吗?如果不支持,则需要使用不同的python包(PyPi regex),因为python的re包不支持可变长度lookbehind或递归,这是匹配嵌套结构所必需的。感谢您的建议和评论。我正在努力编写一个正则表达式,将(MARPOL,第4(4)条;III代码,第8段)定位到(,第4(4)条;III代码,第8段)和(MARPOL,第4(4)条;III代码,第8段)定位到(MARPOL,第4(4)(2)条;III代码,第8段)。
\([^)]*\)
\([^)]*I{3}[^)]*\)