Python正则表达式|运算符匹配顺序及匹配结果疑问
正则表达式分支
|的匹配顺序问题解析 核心规则
Python regex库中,正则的分支(用|分隔的多个规则)是从左到右依次尝试匹配的,只要某个分支在当前位置匹配成功,就会直接选用这个结果,不再尝试后续分支。
你的案例分析
你的正则是r" ?\p{L}+|\s+",拆成两个分支:
- 分支1:
?\p{L}+→ 匹配「可选的1个空格 + 至少1个Unicode字母」 - 分支2:
\s+→ 匹配「1个或多个空白字符」
输入字符串是" s"(4个空格加s),引擎的匹配过程是这样的:
- 从字符串开头(第1个空格的位置)尝试分支1:
分支1要求空格后面必须跟字母,但当前位置后面连续3个都是空格,没有字母,所以分支1匹配失败。 - 接着尝试分支2:开头的4个空格正好符合
\s+的规则,匹配成功,得到结果" "。 - 此时字符串剩下的部分是
"s",引擎从这个位置继续匹配:
尝试分支1:这里没有空格,直接匹配\p{L}+(也就是s),匹配成功,得到结果"s"。
所以最终re.findall()返回的就是[" ", "s"]。
你觉得分支1应该匹配" s",但那是在「单个空格紧跟字母」的场景下才成立。而你的输入中,空格是连续4个,前面的3个空格后面还是空格,根本满足不了分支1中「空格后必须跟字母」的要求,所以只能被分支2匹配。
复现代码
import regex as re pat = re.compile(r" ?\p{L}+|\s+") inputs = " s" print(re.findall(pat, inputs)) # 输出: [' ', 's']
内容的提问来源于stack exchange,提问作者CoffeeCat
相关产品推荐
相关产品推荐

