正则表达式 * ? +
【摘要】 在正则表达式中,*、? 和 + 都是量词(Quantifiers),用于指定前面字符或组的匹配次数。以下是它们的详细解释和对比: 1. *(星号) 含义:匹配前面的字符或组 0 次或多次(即“可有可无,但可以有多个”)。 示例:正则:ab*c匹配:ac(b 出现 0 次)、abc(b 出现 1 次)、abbbc(b 出现多次)。不匹配:ab(缺少结尾的 c)、aabc(b 前面不能有 a)。...
在正则表达式中,*
、?
和 +
都是量词(Quantifiers),用于指定前面字符或组的匹配次数。以下是它们的详细解释和对比:
1. *
(星号)
含义:匹配前面的字符或组 0 次或多次(即“可有可无,但可以有多个”)。
示例:
-
正则:
ab*c
- 匹配:
ac
(b
出现 0 次)、abc
(b
出现 1 次)、abbbc
(b
出现多次)。 - 不匹配:
ab
(缺少结尾的c
)、aabc
(b
前面不能有a
)。
- 匹配:
-
正则:
\d*
(匹配 0 个或多个数字)- 匹配:
""
(空)、"1"
、"123"
。
- 匹配:
2. ?
(问号)
含义:匹配前面的字符或组 0 次或 1 次(即“可有可无,但最多 1 个”)。
示例:
-
正则:
ab?c
- 匹配:
ac
(b
出现 0 次)、abc
(b
出现 1 次)。 - 不匹配:
abbc
(b
出现多次)。
- 匹配:
-
正则:
colou?r
(匹配英式/美式拼写)- 匹配:
color
(u
出现 0 次)、colour
(u
出现 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
- 匹配:
abc
(b
出现 1 次)、abbbc
(b
出现多次)。 - 不匹配:
ac
(b
出现 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 次) |
常见用途
-
*
:匹配可能不存在的模式(如可选的前缀/后缀)。- 示例:
"*optional*"
可以匹配"optional"
或"*optional*"
。
- 示例:
-
?
:匹配可选字符(如英式/美式拼写差异)。- 示例:
"neighbou?r"
匹配"neighbor"
或"neighbour"
。
- 示例:
-
+
:确保某个模式至少出现一次(如数字、字母)。- 示例:
"\d+"
匹配"123"
,但不匹配""
。
- 示例:
高级用法
(1) 指定具体次数 {n,m}
{n}
:匹配 exactlyn
次。{n,}
:匹配至少n
次。{n,m}
:匹配n
到m
次。
示例:
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)