正则表达式 * ? +

举报
福州司马懿 发表于 2025/09/20 17:43:04 2025/09/20
【摘要】 在正则表达式中,*、? 和 + 都是量词(Quantifiers),用于指定前面字符或组的匹配次数。以下是它们的详细解释和对比: 1. *(星号) 含义:匹配前面的字符或组 0 次或多次(即“可有可无,但可以有多个”)。 示例:正则:ab*c匹配:ac(b 出现 0 次)、abc(b 出现 1 次)、abbbc(b 出现多次)。不匹配:ab(缺少结尾的 c)、aabc(b 前面不能有 a)。...

在正则表达式中,*?+ 都是量词(Quantifiers),用于指定前面字符或组的匹配次数。以下是它们的详细解释和对比:


1. *(星号)

含义:匹配前面的字符或组 0 次或多次(即“可有可无,但可以有多个”)。

示例

  • 正则:ab*c

    • 匹配:acb 出现 0 次)、abcb 出现 1 次)、abbbcb 出现多次)。
    • 不匹配:ab(缺少结尾的 c)、aabcb 前面不能有 a)。
  • 正则:\d*(匹配 0 个或多个数字)

    • 匹配:""(空)、"1""123"

2. ?(问号)

含义:匹配前面的字符或组 0 次或 1 次(即“可有可无,但最多 1 个”)。

示例

  • 正则:ab?c

    • 匹配:acb 出现 0 次)、abcb 出现 1 次)。
    • 不匹配:abbcb 出现多次)。
  • 正则:colou?r(匹配英式/美式拼写)

    • 匹配:coloru 出现 0 次)、colouru 出现 1 次)。

特殊用法:非贪婪匹配

  • ? 跟在 *+? 后面时(如 *?+???),表示非贪婪匹配(尽量少匹配)。
  • 示例:
    import re
    text = "<div>hello</div><div>world</div>"
    greedy = re.search(r'<div>.*</div>', text)    # 匹配整个字符串(贪婪)
    lazy = re.search(r'<div>.*?</div>', text)     # 仅匹配第一个 `<div>hello</div>`
    

3. +(加号)

含义:匹配前面的字符或组 1 次或多次(即“至少出现 1 次”)。

示例

  • 正则:ab+c

    • 匹配:abcb 出现 1 次)、abbbcb 出现多次)。
    • 不匹配:acb 出现 0 次)。
  • 正则:\d+(匹配 1 个或多个数字)

    • 匹配:"1""123"
    • 不匹配:""(空)。

对比总结

量词 匹配次数 示例 匹配 "abbc" 匹配 "ac"
* 0 次或多次 ab*c ✅ (b 出现 2 次) ✅ (b 出现 0 次)
? 0 次或 1 次 ab?c ❌ (b 出现 2 次) ✅ (b 出现 0 次)
+ 1 次或多次 ab+c ✅ (b 出现 2 次) ❌ (b 出现 0 次)

常见用途

  1. *:匹配可能不存在的模式(如可选的前缀/后缀)。

    • 示例:"*optional*" 可以匹配 "optional""*optional*"
  2. ?:匹配可选字符(如英式/美式拼写差异)。

    • 示例:"neighbou?r" 匹配 "neighbor""neighbour"
  3. +:确保某个模式至少出现一次(如数字、字母)。

    • 示例:"\d+" 匹配 "123",但不匹配 ""

高级用法

(1) 指定具体次数 {n,m}

  • {n}:匹配 exactly n 次。
  • {n,}:匹配至少 n 次。
  • {n,m}:匹配 nm 次。

示例

  • a{3}"aaa"
  • a{2,4}"aa""aaa""aaaa"

(2) 非贪婪匹配 *?+???

  • 默认情况下,*+?贪婪的(匹配尽可能多的字符)。
  • 加上 ? 后变为非贪婪(匹配尽可能少的字符)。

示例

text = "<div>hello</div><div>world</div>"
re.findall(r'<div>.*</div>', text)  # 贪婪匹配 → `['<div>hello</div><div>world</div>']`
re.findall(r'<div>.*?</div>', text) # 非贪婪匹配 → `['<div>hello</div>', '<div>world</div>']`

总结

量词 匹配次数 非贪婪模式
* 0 次或多次 *?
? 0 次或 1 次 ??
+ 1 次或多次 +?
  • * 最宽松(可有可无,可多个)。
  • ? 最严格(最多 1 个)。
  • + 折中(至少 1 个)。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。