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

时间:2019-12-10 19:57:43

标签: python regex

示例文字:

115有客观证据表明,针对各种强制性IMO文书及其修正案(包括默认修正案)的国家法律的颁布受到延误,并且缺乏相关当局的既定程序和承诺协助该过程(SOLAS 1974,第I条; MARPOL,第1条; LL 1966,第1条; III规则,第4款; III规则,第8款; III规则,第11款)。

我要提取:

SOLAS 1974,第I条; MARPOL,第1条; LL 1966,第1条; III规则,第4段; III规则,第8段; III规则,第11段

我用过re.findall(r'((。* III。*)),但这返回:

(包括默认修订)受到延误,并且相关当局缺乏既定程序和承诺来协助该程序(SOLAS 1974,第I条; MARPOL,第1条; LL 1966,第1条) ; III代码第4段; III代码第8段; III代码第11段)

任何想法,都让我发疯!

1 个答案:

答案 0 :(得分:1)

不清楚您是否只想将括号内带有III的括号匹配。无论如何,我都会在下面提供有无检查的解决方案。


在括号之间提取文本

请查看正在使用的此正则表达式here

\([^)]*\)

工作原理:

  • \(从字面上匹配此字符(
  • [^)]*)以外的任何字符匹配任意次数
  • \)从字面上匹配此字符)

如果括号中包含III,则提取括号中的文本

请查看正在使用的此正则表达式here

\([^)]*I{3}[^)]*\)

与以前的逻辑相同,只是确保存在IIII{3})。


性能

在第二个示例中,I{3}精确匹配I 3次。这比III更有效率。

还提到.*?可以用来代替[^)]*-这是事实,但由于.*?回溯以尽可能少地匹配,因此存在性能成本。否定的字符类方法仍然很贪婪,并避免了回溯的需要,从而使其更加有效。

您可以检查此性能比较here