【问题标题】:How to ignore a specific word in lookbehind?如何忽略lookbehind中的特定单词?
【发布时间】:2020-02-03 09:09:52
【问题描述】:

完整字符串:

See Item 1A. Risk Factors – Regulatory, Compliance and Legal on page 13.
**Here Item 1A. Risk Factors – Regulatory, Compliance and Legal on page 13.**

我正在使用这段代码来获取**中的句子:

(?i)(?<=\D|![see])Item.+?1A.+?Risk Factors(?=\D)(.+?)(?=Item 1B|$)

通过给出特定的词See 来忽略它。

但它仍然需要两个句子。

【问题讨论】:

  • 这是什么风格的正则表达式?你试过^(?!See).*
  • @MateenUlhaq Python
  • @MateenUlhaq 我怎样才能将它包含在我的积极后视中?
  • 是否有更多您希望匹配/不匹配的句子示例?因为这似乎是这种情况下最简单的正则表达式。还要记住,如果你真的需要,你可以应用多次正则表达式。 (这可能会让事情变得更容易。)
  • @MateenUlhaq 是的,为了简单起见,我只是将测试字符串变小了。只是想保留我正在使用的现有代码,并且不匹配任何 See 在后视

标签: python regex


【解决方案1】:

试试

(?i)(?<=\D)(?<!See )Item.+?1A.+?Risk Factors(?=\D)(.+?)(?=Item 1B|$)

这意味着在(?&lt;=\D)之前有一个不同的数字,但也拒绝“看到”的东西(?&lt;!See )

【讨论】:

  • 看起来不错,但有没有办法在 See 之后包含 .+? 以使其比文字空间更健壮?
  • 很遗憾,后面的图案必须是固定大小的
  • 我们可以在没有后视的情况下做到这一点吗?
  • 当然,比如(?i)^(?!see)\D+Item.+?1A.+?Risk Factors(?=\D)(.+?)(?=Item 1B|$)
【解决方案2】:

我会推荐另一种模式(?&lt;=\*\*).+?(?=\*\*)

解释:

(?&lt;=\*\*) - 积极的后视:断言前面是**

.+? - 匹配一个或多个字符(非贪心)

(?=\*\*) - 积极的前瞻:断言后面是**

Demo

【讨论】:

    【解决方案3】:

    如果你想在后面添加一个量词)(?&lt;!\bSee\b.*),你可以使用PyPi regex module

    (?<=\D)(?<!\bSee\b.*)Item.+?1A.+?Risk Factors(?=\D)(.+?)(?=Item 1B|$)
    

    Python demo

    假设** 表示句子之间的差异,您可以看到第二个匹配,因为末尾的**

    例如

    import regex
    
    pattern = r"(?i)(?<=\D)(?<!\bSee\b.*)Item.+?1A.+?Risk Factors(?=\D)(.+?)(?=Item 1B|$)"
    test_str = ("See Item 1A. Risk Factors – Regulatory, Compliance and Legal on page 13.\n"
                "**Here Item 1A. Risk Factors – Regulatory, Compliance and Legal on page 13.**")
    m = regex.search(pattern, test_str)
    print(m.group())
    

    输出

    Item 1A. Risk Factors – Regulatory, Compliance and Legal on page 13.**
    

    另一种选择可能是匹配您不想要的内容并使用交替捕获您想要保留的内容。

    匹配See 出现在Item 之前的整行,并在group 1 中使用后向断言非数字的模式进行捕获。

    (?:^(?:(?!\bItem\b.)*)See\b.*|((?<=\D)Item.+?1A.+?Risk Factors(?=\D).+?(?=Item 1B|$)))
    

    Regex demo

    【讨论】:

      【解决方案4】:

      你可以使用消极的后视:

      (?<!See ) 
      

      如果“See”在句子之前,则不匹配

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-10
        • 2022-02-24
        • 1970-01-01
        • 2012-02-10
        • 2017-09-25
        • 1970-01-01
        相关资源
        最近更新 更多