首页 > 解决方案 > Python re.findall 避免急切

问题描述

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

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)

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

再次感谢

标签: pythonregexfindall

解决方案


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

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

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

推荐阅读