Python 使用正则表达式提取某些短语,但排除后跟单词“quot;“的;

Python 使用正则表达式提取某些短语,但排除后跟单词“quot;“的;,python,regex,nlp,jupyter-notebook,Python,Regex,Nlp,Jupyter Notebook,我基本上是试图从一个长文档中提取节引用 下面的代码做得很好: 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)条 然而,这些章节经常涉及外部书籍,我想指出或排除它们。通常,如果章节参考涉及另一本书,则章节参

我基本上是试图从一个长文档中提取节引用

下面的代码做得很好:

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'
res = re.search(r'Sections?(\W+(\w+)(\(\w+\))?(, (\w+)(\(\w+\))?)*)(?!\s+of)', example2)
res.group(0)

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

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

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

另一种解决方案是在
可选部分之后使用所有格量词
+

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

注意
+
后面的

您可以通过捕获组和前瞻来模拟原子组:

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

长话短说: *在正向前瞻中,您创建了一个名为
section
的捕获组,用于查找节模式 *然后匹配
(?P=secion)
*然后,在负前瞻中,检查是否没有后续的


下面是一个解释这种技术的例子。

那么最终结果应该是什么呢?你想在这里捕获“哈利波特”部分吗?你的第一个和第二个示例具有相同的输入字符串。如果是这样,你可以使用
部分(\W+.\s\W+\s\W+)
来捕获上述模式,还是我遗漏了什么?嗯,这对你有用吗?因为我得到了以下错误:位置46处的multiple repeat确实,遗憾的是,它对python不起作用,我尝试将其用于re.findall(因为每个部分有多个引用),但不知怎的,它以奇怪的方式复制了答案。示例1='section 23、24和5'res=re.findall(r'(?=(?)(\W+)(,(\W+)(\W+)(\W+)*)(?P=section)(?!of),示例1)输出:[('section 23、24'、''、24'、'')正则表达式中有多个捕获组,请将它们更改为非捕获组(使用
(:?)
,而不是
(…)
“…”在任何地方,对吗?我应该在哪里添加(:?…)?是的,将
(…)
替换为
(:?…)
,我的意思是在正则表达式中。但是它不太好用。您也可以选择输出中元组的第一个元素(这是完全匹配)。
(?=(?P<section>Sections?\W+(\w+)(\(\w+\))?(, (\w+)(\(\w+\))?)*))(?P=section)(?! of)