使用正则表达式提取某些短语但排除短语后跟单词“of”

时间:2018-03-12 10:33:57

标签: python regex nlp jupyter-notebook

我基本上是尝试从长文档中提取Section引用。

以下代码表现得非常好:

example1 = 'Sections 21(1), 54(2), 78(1) of Harry Potter'
res = re.search(r'Sections?\W+(\w+)(\(\w+\))?(, (\w+)(\(\w+\))?)*', example1)
res.group(0)

输出:'第21(1),54(2),78(1)条

然而,这些部分经常引用外部书籍,我想要指出或排除它们。一般来说,如果它引用另一本书(下面的例子),则该部分引用后面跟着“of”:

example2 = 'Sections 21(1), 54(2), 78(1) of Harry Potter'

所以在这种情况下,我想排除这些部分,因为它们是指哈利波特,而不是文档中的部分。以下内容应该实现,但不起作用。

example2 = 'Sections 21(1), 54(2), 78(1) of Harry Potter'
res = re.search(r'Sections?(\W+(\w+)(\(\w+\))?(, (\w+)(\(\w+\))?)*)(?!\s+of)', example2)
res.group(0)

预期输出:Sections 21(1), 54(2), 78 - > (?!\s+of)删除(1)后面的78,但不删除整个引用。

2 个答案:

答案 0 :(得分:1)

您可以使用捕获组和前瞻模拟原子组:

(?=(?P<section>Sections?\W+(\w+)(\(\w+\))?(, (\w+)(\(\w+\))?)*))(?P=section)(?! of)

Demo

长话短说:   *在正面预测中,您可以创建一个名为section的捕获组,用于查找剖面图案   *然后你匹配(?P=secion)中的群组内容   *然后在否定预测中,检查后面没有of

这是解释该技术的really good answer

答案 1 :(得分:0)

这是因为在(?!\s+of)失败后,它会在匹配的可选(\(..\))?之前回溯,因为否定前瞻不匹配。

Atomic group可以与其他正则表达式引擎一起使用,但不能在python re中实现。

其他解决方案是在+可选部分之后使用占有量词?

r'Sections?(\W+(\w+)(\(\w+\))?(, (\w+)(\(\w+\))?+)*)(?!\s+of)'

请注意+

之后的?