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

Python正则表达式|运算符匹配顺序及匹配结果疑问

正则表达式分支|的匹配顺序问题解析

核心规则

Python regex库中,正则的分支(用|分隔的多个规则)是从左到右依次尝试匹配的,只要某个分支在当前位置匹配成功,就会直接选用这个结果,不再尝试后续分支。

你的案例分析

你的正则是r" ?\p{L}+|\s+",拆成两个分支:

  • 分支1: ?\p{L}+ → 匹配「可选的1个空格 + 至少1个Unicode字母」
  • 分支2:\s+ → 匹配「1个或多个空白字符」

输入字符串是" s"(4个空格加s),引擎的匹配过程是这样的:

  1. 从字符串开头(第1个空格的位置)尝试分支1:
    分支1要求空格后面必须跟字母,但当前位置后面连续3个都是空格,没有字母,所以分支1匹配失败。
  2. 接着尝试分支2:开头的4个空格正好符合\s+的规则,匹配成功,得到结果" "。
  3. 此时字符串剩下的部分是"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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:45:44