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-\u303f\u3099-\u309c\u30a0-\u30ff\u3400-\u4dbf\uf900-\ufaff] - Emoji(基础常见):
[\U0001f300-\U0001f6ff\U0001f900-\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)可限定拉丁字母脚本










