示例文字:
“ 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段)”
任何想法,都让我发疯!
答案 0 :(得分:1)
不清楚您是否只想将括号内带有III
的括号匹配。无论如何,我都会在下面提供有无检查的解决方案。
请查看正在使用的此正则表达式here。
\([^)]*\)
工作原理:
\(
从字面上匹配此字符(
[^)]*
与)
以外的任何字符匹配任意次数\)
从字面上匹配此字符)
III
,则提取括号中的文本请查看正在使用的此正则表达式here。
\([^)]*I{3}[^)]*\)
与以前的逻辑相同,只是确保存在III
(I{3}
)。
在第二个示例中,I{3}
精确匹配I
3次。这比III
更有效率。
还提到.*?
可以用来代替[^)]*
-这是事实,但由于.*?
回溯以尽可能少地匹配,因此存在性能成本。否定的字符类方法仍然很贪婪,并避免了回溯的需要,从而使其更加有效。
您可以检查此性能比较here。