最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
正则表达式里匹配模式的顺序优先级
时间:2026-07-14 11:10:54 编辑:袖梨 来源:一聚教程网
正则表达式匹配严格按从左到右顺序逐字符试探,依赖引擎规则而非“最像”;贪婪量词靠回溯调整,分支|左优先,锚点控制匹配位置。
正则表达式匹配不是“挑最像的”,而是严格按书写顺序和引擎规则一步步试探出来的。理解这个顺序,才能写出稳定、可预期的正则。
模式从左到右逐字符解析
引擎不会跳着看,它从正则开头第一个符号开始,逐个消费目标字符串的字符。比如 a.b 在 "axb" 中能匹配,是因为:
- 先匹配 a(位置 0)
- 再匹配任意非换行符(. 匹配 x)
- 最后匹配 b(位置 2)
任何一步失败,就回退或换起始位置重试。
量词默认贪婪,但靠回溯调整
*、+、{m,n} 默认尽可能多吃字符,但前提是整个模式能最终成立。吃多了导致后面无法匹配时,引擎会“吐出”字符再试——这就是回溯。
-
a.*b在"a123b456b"中匹配整个串,因为.*先吞到末尾,再一点点吐,直到最后一个b能对上 - 想停在第一个
b?用非贪婪:a.*?b→ 匹配"a123b" - 回溯太深可能拖慢甚至引发灾难性回溯,尤其嵌套量词如
(a+)+
分支 | 严格左优先,不自动选最长
| 不是并行判断,而是“先试左边,成功就返回,右边根本不管”。这常导致意料之外的结果:
-
cat|caterpillar在"caterpillar"中只匹配"cat"(左边先成) -
caterpillar|cat才会匹配完整单词(长分支放前) -
a|ab在"ab"中只取"a",剩下"b"被忽略——这不是 bug,是规则
锚点和边界决定“从哪开始试”
^、$、b 本身不占字符,但强制匹配必须发生在特定位置,从而改变实际生效的起点:
-
re.match(r"a.*b", "x a1b y")返回None,因为match()要求从开头匹配,而首字符是"x" -
re.search(r"baw*bb", "I have a1b and a2b.")能分别找到两个单词,b确保a1b不被当作"have"的一部分 -
^和$组合起来就是整行精确匹配:^abc$只认"abc"这一行
相关文章
- TBH塔斯克巴英雄全职业加点方案推荐 07-17
- 爱发电网页版登录官方地址-爱发电登录入口 07-17
- 纸嫁衣9罗浮梦 第一章图文通关攻略 07-17
- 瞬搭心屿拾色活动结局达成流程指引 07-17
- 2026年7月三国百将牌最新可用兑换码分享 07-17
- 晃晃人生各区域赚钱最快方法攻略 07-17