使用正则表达式提取特定单词后跟某些语法(如括号)

时间:2018-03-09 16:12:14

标签: python regex pattern-matching

我有一个非常大的文档,其中包含不同格式的节引用。我想用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在这种情况下不是最好的,我也愿意使用其他库。谢谢!

2 个答案:

答案 0 :(得分:1)

尝试:

Sections?\W+(\w+)(\(\w+\))?(, (\w+)(\(\w+\))?)*

Demo

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

Demo

  • \b确保您匹配到单词结尾
  • (?! of)检查单词边界后面没有空格,后跟of

答案 1 :(得分:1)

可能永远不会成为一个全能的正则表达式 - 但是以下内容非常接近你想要的:

Sections?( *\d+((\(\d+\))*,?(?= *))*)+

Sections? = SectionSections

( *\d+((\(\d+\))*,?(?= *))*)+ = 1或更多:0或更多空格,然后是1位或更多位数,可选地后跟大括号中的1位或更多位数,然后可选地使用逗号和0或空格。

'尾随'空间使用积极的前瞻,因此它不包含在匹配中,因此您不需要去除尾随空格。

Try it out