代码之家  ›  专栏  ›  技术社区  ›  Mia

使用Regex提取某些短语,但排除后跟单词“of”的短语

  •  1
  • Mia  · 技术社区  · 8 年前

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

    以下代码做得很好:

    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 回复  |  直到 8 年前
        1
  •  1
  •   mrzasa    8 年前

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

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

    Demo

    长话短说: *在正向前瞻中,您创建了一个名为 section 找到剖面图案的 *然后匹配中的组内容 (?P=secion) *然后在负前瞻中检查 of 下列的

    这是一个 really good answer 这就解释了这种技术。

        2
  •  0
  •   Nahuel Fouilleul    8 年前

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

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

    另一种解决方法是使用所有格量词 + 之后 ? 可选部件:

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

    请注意 + 之后 ?