python 3中re模块默认启用unicode模式,w等元字符可匹配汉字、日文等unicode字符;需显式加re.u标志或(?u)内联标志以确保兼容性,匹配中文可用[u4e00-u9fff],更强大功能推荐使用Regex模块。

Python 正则表达式默认不支持直接匹配 Unicode 字符(如中文、日文、emoji 等),需显式启用 Unicode 模式,否则 w、d、s 等预定义字符类仅作用于 ASCII 范围。
Unicode 模式开启方式
在 re 模块中,通过 flags=re.UNICODE(或简写 flags=re.U)启用 Unicode 支持。Python 3 中 re 默认已启用 Unicode 模式(即 re.U 是默认行为),但显式指定更稳妥,尤其在跨版本兼容或明确语义时。
- 推荐写法:
re.search(r'w+', text, flags=re.U) - 也可用内联标志:
re.search(r'(?u)w+', text) - 注意:若同时使用
re.ASCII,它会覆盖 Unicode 行为,使w只匹配[a-zA-Z0-9_]
w、W、b 在 Unicode 下的实际范围
启用 Unicode 后,w 不再只是 [a-zA-Z0-9_],而是匹配所有 Unicode “字母”“数字”和下划线(包括汉字、平假名、片假名、阿拉伯数字、梵文字母等);b 的单词边界也基于 Unicode 字符属性判断。
-
w≈[p{L}p{N}_](类 PCRE 的 Unicode 属性写法,Python 原生不支持 p{},但w效果类似) - 例如:
re.findall(r'w+', 'Hello世界123_测试')→['Hello', '世界', '123', '测试'] -
b能正确识别中英文混排的词边界,如r'b测试b'可匹配独立“测试”,不匹配“测试版”中的“测试”
匹配特定 Unicode 字符块的常用技巧
Python 原生正则不支持 p{Han} 这类 Unicode 属性语法,但可通过 Unicode 码点范围手动构造字符类。
立即学习“Python免费学习笔记(深入)”;
- 中文汉字(基本汉字区):
[u4e00-u9fff] - 中文全角标点:
[u3000-u303fu3099-u309cu30a0-u30ffu3400-u4dbfuf900-ufaff] - Emoji(基础常见):
[U0001f300-U0001f6ffU0001f900-U0001f9ff](注意用大写U表示 8 位 Unicode) - 组合写法示例:
r'[u4e00-u9fff]+|[U0001f300-U0001f6ff]+'匹配连续汉字或连续 emoji
推荐替代方案:regex 模块
如需更强大的 Unicode 支持(如 p{Script=Han}、p{Letter}、大小写忽略的 Unicode 意识等),可安装第三方 regex 模块(pip install regex),它是 re 的超集,API 兼容且扩展丰富。
-
import regex后,regex.findall(r'p{Han}+', 'Python编程很有趣')→['编程', '有', '趣'] -
p{L}匹配任意 Unicode 字母,p{Nd}匹配任意 Unicode 十进制数字 -
regex.fullmatch(r'p{Script=Latin}+', 'hello', flags=regex.U)可限定拉丁字母脚本