为何上标³会匹配Python正则表达式的字母字符规则?
为什么正则
[^\W\d_]+会匹配³? 核心原因拆解
要搞懂这个现象,得从正则逻辑和Python re模块的Unicode匹配规则两方面分析:
正则
[^\W\d_]+的实际逻辑\W是\w的补集,[^\W]等价于\w;- 所以
[^\W\d_]的意思是:从\w的匹配范围内,排除\d(数字)和_(下划线),理论上应该只匹配Unicode字母。
Python
re的Unicode匹配规则- Python 3中,
re模块默认启用Unicode模式:\w会匹配所有Unicode标准定义的字母(L类,如大写字母Lu、小写字母Ll等)、全类别数字(N类,包括十进制数字Nd、上标/下标这类非十进制数字符号No),再加上下划线_;- 而
\d默认仅匹配Unicode的十进制数字(Nd类),像³(Unicode编码U+00B3,属于No类:Other Number)这类非十进制数字符号,不在\d的匹配范围内。
- Python 3中,
³的匹配判定³属于Unicode的No类数字,因此被\w包含(不在\W范围内);³不属于\d的匹配范围;³不是下划线_;- 完全符合
[^\W\d_]的匹配条件,所以会被成功匹配。
精准匹配Unicode字母的方法
如果只想匹配纯Unicode字母,建议使用Unicode属性类\p{L},示例代码:
import re # \p{L}仅匹配所有Unicode字母,不会匹配非十进制数字 print(re.match(r"\p{L}+", '³')) # 输出None print(re.match(r"\p{L}+", 'abc')) # 输出<re.Match object; span=(0, 3), match='abc'>
内容的提问来源于stack exchange,提问作者user2801282
相关产品推荐
相关产品推荐

