前言
正则表达式是文本处理的核心工具,但传统正则在处理多语言、多字符集时常常力不从心。Unicode 正则通过标准化的字符属性分类,让跨语言文本匹配、清洗、提取变得精准可靠。
以下将基于 Unicode 官方规范与工程实践,系统梳理 Unicode 属性、子属性、语言脚本、编码区块,提高掌握国际化文本处理能力。
一、为什么要用 Unicode 正则
-
传统正则只能匹配有限字符,无法覆盖全语种
-
统一匹配中文、日文、阿拉伯文、符号、数字、标点
-
精准过滤控制字符、空白符、特殊符号
-
天然兼容 UTF‑8/UTF‑16,适合现代应用文本治理
二、Unicode 基础属性分类(\p {...})
Unicode 把所有字符分为7 大核心类别,是最常用的匹配维度。
-
\p{L} / Letter:字母类(含中英日韩等所有文字)
-
\p{M} / Mark:修饰符号(重音、变音、声调)
-
\p{Z} / Separator:分隔符(空格、换行、段落分隔)
-
\p{S} / Symbol:符号(货币、图标、图形、运算符)
-
\p{N} / Number:数字(阿拉伯数字、罗马数字等)
-
\p{P} / Punctuation:标点符号
-
\p{C} / Other:控制字符、未分配字符等
三、常用子属性
1. Letter 子类
-
\p{Ll}:小写字母
-
\p{Lu}:大写字母
-
\p{L&}:Ll+Lu+Lt(大小写字母合集)
-
\p{Lo} :无大小写文字(中文、日文、韩文、阿拉伯文)
2. Separator 子类
-
\p{Zs}:空格类空白
-
\p{Zl}:行分隔符 U+2028
-
\p{Zp}:段落分隔符 U+2029
3. Number 子类
-
\p{Nd}:0-9 阿拉伯数字
-
\p{Nl}:罗马数字
-
\p{No}:上标、下标、特殊数字符号
4. Punctuation 子类
-
\p{Pd}:横杠 / 连接符
-
\p{Ps} / \p{Pe}:开括号 / 闭括号
-
\p{Pi} / \p{Pf}:前引号 / 后引号
-
\p{Pc}:连接标点(如下划线)
-
\p{Po}:其他标点(!@#$%^&* 等)
四、Unicode Script:按语言匹配
用 \p{Script} 精准匹配某一语言文字,是中文 / 多语言处理必备。
常用脚本:
-
\p{Han}:汉字(最常用)
-
\p{Latin}:拉丁字母
-
\p{Cyrillic}:西里尔字母
-
\p{Arabic}:阿拉伯文
-
\p{Thai}:泰文
-
\p{Hiragana}:日文平假名
-
\p{Katakana}:日文片假名
-
\p{Hangul}:韩文
示例:只提取汉字
python
import regex
regex.findall(r'\p{Han}', '孔子/现代价值/Theory of "Knowing"')
# 结果:['孔','子','现','代','价','值']
五、Unicode Block:按编码区间匹配
按 Unicode 编码段匹配,适合更底层的字符范围控制。
常用区块:
-
\p{InBasic_Latin}:U+0000--U+007F
-
\p{InCJK_Unified_Ideographs}:U+4E00--U+9FFF(常用汉字)
-
\p{InCJK_Symbols_and_Punctuation}:U+3000--U+303F(中文标点)
-
\p{InHalfwidth_and_Fullwidth_Forms}:U+FF00--U+FFEF(全角符号)
六、常用表达式
1.只保留文字,去除数字、符号、标点
python
regex.sub(r'[^\p{L}]', '', '1孔子/现代价值/Theory of "Knowing')
# 输出:孔子现代价值TheoryofKnowing
2.只提取中文
python
regex.findall(r'\p{Han}+', text)
3.清洗所有空白符(含全角空格)
python
regex.sub(r'\p{Z}+', ' ', text)
4.移除所有标点符号
python
regex.sub(r'\p{P}', '', text)
5.只保留字母 + 数字
python
regex.sub(r'[^\p{L}\p{N}]', '', text)
七、使用注意事项
-
Python 内置
re不支持 Unicode 属性,用 regex 库bashpip install regex -
大小写敏感:
\p{Han}正确,\p{han}无效 -
反向匹配用 \P{...}(大写 P)
-
ES、Java、Go 等语言对 Unicode 正则支持略有差异