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)
失败后,它会在可选的(\(…)?
之前回溯,因为反向前瞻不匹配
原子组可以与其他正则表达式引擎一起使用,但不能在pythonre
中实现
另一种解决方案是在?
可选部分之后使用所有格量词+
:
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)