我有一个非常大的文档,其中包含不同格式的节引用。我想用Python&提取这些引用。正则表达式。
字符串格式示例:
1)第23节
2)第45(3)条
3)第75节的(e)点
4)第21(1),54(2),78(1)条
现在,我有以下代码:
s = "This is a sample for Section 231"
m = re.search('Section\\W+(\\w+)', s)
m.group(0)
输出为:Section 231
这完全有效,除了它没有考虑其他格式化案例。
有没有办法表明对于231(1)
,还应该提取(1)
?或者如果列出其他几个,请包括以下部分编号?
如果您认为Regex在这种情况下不是最好的,我也愿意使用其他库。谢谢!
答案 0 :(得分:1)
尝试:
Sections?\W+(\w+)(\(\w+\))?(, (\w+)(\(\w+\))?)*
>>> s = 'Sections 21(1), 54(2), 78(1)'
>>> res = re.search(r'Sections?\W+(\w+)(\(\w+\))?(, (\w+)(\(\w+\))?)*', s)
>>> res.group(0)
# => 'Sections 21(1), 54(2), 78(1)'
说明:
Sections?
匹配" Section"可选择s
\W+(\w+)(\(\w+\))?
匹配部分编号/标题(正如您所做的那样)并在括号中添加可选文字(, (\w+)(\(\w+\))?)*
允许重复逗号和空格后的节号模式 修改强>
要排除Section 1 of Other Book
,您可以使用字边界和否定前瞻的组合:
Sections?\W+(\w+)(\(\w+\))?(, (\w+)(\(\w+\))?)*\b(?! of)
\b
确保您匹配到单词结尾(?! of)
检查单词边界后面没有空格,后跟of
答案 1 :(得分:1)
可能永远不会成为一个全能的正则表达式 - 但是以下内容非常接近你想要的:
Sections?( *\d+((\(\d+\))*,?(?= *))*)+
Sections?
= Section
或Sections
( *\d+((\(\d+\))*,?(?= *))*)+
= 1或更多:0或更多空格,然后是1位或更多位数,可选地后跟大括号中的1位或更多位数,然后可选地使用逗号和0或空格。
'尾随'空间使用积极的前瞻,因此它不包含在匹配中,因此您不需要去除尾随空格。