【问题标题】:Python re.findall avoiding eagerness [duplicate]Python re.findall 避免急切 [重复]
【发布时间】:2020-03-06 19:02:01
【问题描述】:

当引擎在正则表达式模式中找到第一个替代项时,我遇到了问题,它停止分析右侧的其他字符串位置。例如,我有以下示例:

在字符串ABC SCHOOL FOUNDATION COOPERATIVE PARTNERSHIP 中,我想得到['foundation cooperative partnership'] 作为匹配项。但是,我得到了['foundation', 'cooperative'],因为引擎找到了foundation,然后继续下面的单词cooperative,它也匹配。我正在使用以下代码:

import re

name='ABC SCHOOL FOUNDATION COOPERATIVE PARTNERSHIP'
regex='(community contribution company|foundation cooperative partnership|cooperative|foundation)(?=\s)'

found= re.findall(regex, name.lower())

print(found)

如何使正则表达式在分析FOUNDATION 后继续使用下一个单词COOPERATIVE PARTNERSHIP,而不是在分别找到foundationcooperative 时放弃?

再次感谢

【问题讨论】:

  • 使用\b(?=\s|$) 而不是(?=\s),因为(?=\s) 声明后面有一个空格字符必须,但@ 末尾没有空格987654335@字符串。
  • 并且在开头添加\b 也不会受到伤害(所以你总是匹配整个单词)。
  • 如果您想将尾随标点符号视为单词的一部分,请使用 (?!\S)
  • 你需要在你的正则表达式前面使用r 来转义反斜杠并使其变为文字(将其视为原始字符串),否则你的修复将不起作用
  • 您的模式与示例中输入字符串中的foundation cooperative partnership 不匹配,即使您让它停止单独停止匹配foundationcooperative,因为partnership 不是后跟一个空格字符。

标签: python regex findall


【解决方案1】:

(?=\s) 更改为\b 以匹配单词边界。字符串末尾没有空格,因此在尝试匹配整个字符串时,前瞻失败。

并且几乎总是对正则表达式使用原始字符串,这样正则表达式转义序列就不会被作为字符串转义序列处理。

>>> regex=r'(community contribution company|foundation cooperative partnership|cooperative|foundation)\b'
>>> re.findall(regex, name.lower())
['foundation cooperative partnership']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    相关资源
    最近更新 更多