如何编写正则表达式匹配两个指定单词中间存在可选单词的场景
原有写法的问题
- 你写的
[a-z+]属于正则字符类,仅能匹配单个小写英文字母或+号,无法匹配完整的多字母单词,且+放在字符类内只会被识别为普通字符,不会生效量词作用 - 原有写法强制要求
green和apple中间必须存在1个字符,无法适配两个词直接相邻的"green apple"场景
正确写法
可以用非捕获组匹配「空格+单词」的0次或多次重复,适配中间无额外单词、有1个或多个额外单词的场景:
r"green(?:\s+[a-z]+)*\s+apple"
语法说明
(?:\s+[a-z]+)*:?:表示非捕获组不占用捕获分组名额,\s+匹配1个或多个空格,[a-z]+匹配1个或多个小写字母组成的单词,*表示整个组可以出现0次或多次- 该正则可以覆盖的匹配场景:
"green apple""green big apple""green small sour apple"
可选调整方案
- 如果需要支持大小写混用(比如匹配
Green Apple),可以在编译正则时添加re.I修饰符 - 如果需要支持单词中含数字、下划线,可将
[a-z]+替换为\w+ - 如果需要限制中间最多出现N个额外单词,可将
*替换为{0,N},比如{0,2}表示中间最多允许2个额外单词 - 如果要求单词间只能有1个半角空格,可将所有
\s+替换为\s - 如果需要避免匹配到前缀后缀包含其他字符的场景(比如
bluegreen apple、green appletree),可以在正则首尾添加单词边界:r"\bgreen(?:\s+[a-z]+)*\s+apple\b"
内容的提问来源于stack exchange,提问作者Timur
相关产品推荐
相关产品推荐

