You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python正则表达式中*与?量词匹配结果相同的疑惑求解

正则表达式量词匹配逻辑讲解

首先明确两个常见的正则字符集误用问题:

  • [doctor]是字符匹配集,代表匹配d/o/c/t/r中的任意单个字符,不是匹配完整的doctor单词
  • ['s]同样是字符匹配集,代表匹配单引号'或者字母s中的任意单个字符,不是匹配字符串's

原正则 [doctor]+['s]* 匹配逻辑

原测试字符串为:"doctor doctors doctor's",三个目标片段用空格分隔,空格不属于上述两个字符集的匹配范围,因此匹配会按片段拆分处理:

  1. 前缀[doctor]+为贪婪匹配,会尽可能匹配1个及以上符合要求的字符,刚好可以匹配每个片段开头的doctor部分
  2. 后缀['s]*代表匹配0次或多次'/s字符:
    • 第一个片段doctor后无符合字符,后缀匹配0次,最终匹配结果为doctor
    • 第二个片段doctors后有1个s,后缀匹配1次,最终匹配结果为doctors
    • 第三个片段doctor's后有'和s两个符合字符,后缀匹配2次,最终匹配结果为doctor's
      最终得到3个不重叠的匹配结果,和运行结果一致。

修改后正则 [doctor]+['s]? 匹配逻辑

后缀的?代表匹配0次或1次符合要求的字符,前缀匹配逻辑和上述完全一致:

  1. 第一个片段doctor后无符合字符,后缀匹配0次,最终匹配结果为doctor
  2. 第二个片段doctors后有1个s,后缀匹配1次,最终匹配结果为doctors
  3. 第三个片段doctor's后第一个符合字符是',后缀匹配1次,最终匹配结果为doctor',剩余的s不属于[doctor]的匹配范围,无法触发新的前缀匹配,不会产生额外的匹配项
    因此最终依然得到3个不重叠的匹配结果。

符合注释需求的正确写法

如果需要准确匹配doctor、doctors、doctor's三种形式,应该避免字符集的误用,正确写法如下:

regex = re.compile(r"doctor(?:'s|s)?")

该正则的逻辑是匹配完整的doctor字符串,后接可选的's或者s后缀,匹配结果完全符合需求。

内容的提问来源于stack exchange,提问作者Max Taylor-Hayden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 17:36:04