我基本上是尝试从长文档中提取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
,但不删除整个引用。
答案 0 :(得分:1)
您可以使用捕获组和前瞻模拟原子组:
(?=(?P<section>Sections?\W+(\w+)(\(\w+\))?(, (\w+)(\(\w+\))?)*))(?P=section)(?! of)
长话短说:
*在正面预测中,您可以创建一个名为section
的捕获组,用于查找剖面图案
*然后你匹配(?P=secion)
中的群组内容
*然后在否定预测中,检查后面没有of
这是解释该技术的really good answer。
答案 1 :(得分:0)
这是因为在(?!\s+of)
失败后,它会在匹配的可选(\(..\))?
之前回溯,因为否定前瞻不匹配。
Atomic group可以与其他正则表达式引擎一起使用,但不能在python re
中实现。
其他解决方案是在+
可选部分之后使用占有量词?
:
r'Sections?(\W+(\w+)(\(\w+\))?(, (\w+)(\(\w+\))?+)*)(?!\s+of)'
请注意+
?