【问题标题】:Match in whole string with punctuation (issues using \b)用标点符号匹配整个字符串(使用 \b 的问题)
【发布时间】:2023-03-26 11:12:01
【问题描述】:

通常为了匹配完整的单词,我们使用\b 作为单词分隔符,但是当我们处理包含标点符号的复合世界时,这种方法效果不佳。例如,假设以下字符串:

basic school co-operative limited

如果我们应用以下正则表达式,我们会得到co-operativelimited 的预期。发生这种情况是由于交流发电机中的顺序:

\b(co-operative|co|co.|limited)\b

如果我无法控制正则表达式交流器的顺序并且我得到以下正则表达式会怎样?

\b(co|co.|co-operative|limited)\b

在这种情况下,只会匹配 co limited 而不是 co-operative limited。我们有什么办法可以按照交替的顺序解决问题吗?

感谢您的无价帮助

【问题讨论】:

    标签: python regex regex-lookarounds regex-group


    【解决方案1】:

    由于您想匹配完整的单词,您可以将正则表达式末尾的 \b 断言更改为空格或字符串末尾的正向前瞻,例如

    \b(co|co.|co-operative|limited)(?=\s|$)
    

    Demo on regex101

    如果您想在单词后允许某些标点符号,您可以将其添加到前瞻中,例如

    \b(co|co.|co-operative|limited)(?=[\s.]|$)
    

    【讨论】:

    • 当然@Nick :) 非常感谢。非常干净的解决方案。
    • @JuanPerez 不用担心 - 我很高兴能提供帮助。
    【解决方案2】:

    如果可能的话,您可以尝试使用 ? 量词替换交替来捕获最长的版本:

    \b(co(-operative)?.?|limited)\b
    

    https://regex101.com/r/1D6BsU/1

    不幸的是,这也将匹配“合作社”,因此我们可以更加明确地避免这种极端情况:

    \b(co(-operative(?=\b))?.?|limited)\b
    

    https://regex101.com/r/1D6BsU/2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-25
      • 2021-11-22
      • 2016-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多