Unicode 正则表达式开发指南

前言

正则表达式是文本处理的核心工具,但传统正则在处理多语言、多字符集时常常力不从心。Unicode 正则通过标准化的字符属性分类,让跨语言文本匹配、清洗、提取变得精准可靠。

以下将基于 Unicode 官方规范与工程实践,系统梳理 Unicode 属性、子属性、语言脚本、编码区块,提高掌握国际化文本处理能力。


一、为什么要用 Unicode 正则

  • 传统正则只能匹配有限字符,无法覆盖全语种

  • 统一匹配中文、日文、阿拉伯文、符号、数字、标点

  • 精准过滤控制字符、空白符、特殊符号

  • 天然兼容 UTF‑8/UTF‑16,适合现代应用文本治理


二、Unicode 基础属性分类(\p {...})

Unicode 把所有字符分为7 大核心类别,是最常用的匹配维度。

  1. \p{L} / Letter:字母类(含中英日韩等所有文字)

  2. \p{M} / Mark:修饰符号(重音、变音、声调)

  3. \p{Z} / Separator:分隔符(空格、换行、段落分隔)

  4. \p{S} / Symbol:符号(货币、图标、图形、运算符)

  5. \p{N} / Number:数字(阿拉伯数字、罗马数字等)

  6. \p{P} / Punctuation:标点符号

  7. \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)

七、使用注意事项

  1. Python 内置 re 不支持 Unicode 属性,用 regex 库

    bash 复制代码
    pip install regex
  2. 大小写敏感:\p{Han} 正确,\p{han} 无效

  3. 反向匹配用 \P{...}(大写 P)

  4. ES、Java、Go 等语言对 Unicode 正则支持略有差异

相关推荐
wangchunyu1143 小时前
JAVA CompletableFuture异步编程实战
java·开发语言·python
2501_944521594 小时前
Immer 跨端三方库仓颉适配全流程
python·eclipse·django
信誓旦旦的程序猿5 小时前
【Python量化实战宝典 #26】止损与回撤控制手册:移动止损、最大回撤(Python 可跑)
python·1024程序员节·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
2501_944521595 小时前
Deepmerge 跨端三方库仓颉适配全流程
java·python·eclipse·github
Patrick在香港5 小时前
同一行 strftime,两台机器跑出两种日期
python·datetime·时区·locale·日期处理
2601_967987375 小时前
用Python+OpenCV+YOLO写个游戏脚本:从自动瞄准到自动采集的保姆级教程
python·opencv·yolo·目标检测·游戏自动化
meiying88385 小时前
快递单号批量查询Python脚本:从手动到自动化的完整实现
开发语言·python·自动化
人工智能导论实践课5 小时前
【GUI桌面开发3】PyCharm配置外部工具
ide·python·pycharm
一千柯橘5 小时前
LangChain 的实时输出处理: stream_events 和 Streaming
python·langchain·agent
贾公子5 小时前
图片 AIGC 检测接入实战——URL 与 Base64 的取舍、体积校验与「你送过去的可能不是那张图」
python·aigc