Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从文本文件中提取两个括号之间的文本_Python_Regex - Fatal编程技术网

Python 从文本文件中提取两个括号之间的文本

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.

示例文本:

“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款)


任何想法都会让我发疯!

不清楚您是否只想将括号与括号中的
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}[^)]*\)