核心要点
在 Python 3 中,字符串默认就是 Unicode 字符串,这意味着你不需要做任何特殊设置就可以直接在正则表达式中匹配 Unicode 字符,关键在于如何正确地编写正则表达式模式来表示这些 Unicode 字符或字符类别。

直接匹配 Unicode 字符
这是最简单直接的方式,如果你知道要匹配的具体 Unicode 字符,可以直接在正则表达式中写出来。
示例:匹配中文“你好”
import re
text = "你好,世界!Hello, World!"
pattern = r"你好"
match = re.search(pattern, text)
if match:
print(f"找到匹配: {match.group()}") # 输出: 找到匹配: 你好
else:
print("未找到匹配")
示例:匹配特定的 Emoji
import re
text = "我喜欢 😊 和 🚀"
pattern = r"😊"
match = re.search(pattern, text)
if match:
print(f"找到匹配: {match.group()}") # 输出: 找到匹配: 😊
使用 Unicode 属性转义(\p{...})—— 推荐方式
直接匹配具体字符不够灵活,更强大、更推荐的方式是使用 Unicode 属性转义,它允许你根据字符的 Unicode 属性(如“它是字母吗?”“它是数字吗?”“它是哪种语言的字母?”)来进行匹配。

重要提示:
- Python 3.3+ 开始原生支持
\p{}语法。 - 你需要使用
regex库,而不是 Python 内置的re库。re库对 Unicode 属性的支持非常有限且不完整。 regex库是re的超集,完全兼容re,并且功能更强大,强烈推荐用于复杂的 Unicode 处理。
安装 regex 库:
pip install regex
常用的 Unicode 属性类别
| 类别 | 描述 | 示例 |
|---|---|---|
\p{L} |
任何语言的字母 | a, 你, , |
\p{N} |
任何语言的数字 | 1, , , |
\p{P} |
任何语言的标点符号 | , , , |
\p{S} |
任何语言的符号 | , , , |
\p{Z} |
分隔符(空格、换行等) | `,\t\n` |
\p{M} |
组合字符(如变音符号) | (可以分解为 e + ) |
\p{Script=<脚本名>} |
特定书写系统的字符 | \p{Script=Han} (中日韩汉字), \p{Script=Hiragana} (平假名), \p{Script=Latin} (拉丁字母) |
实战示例(使用 regex 库)
示例 1:匹配所有语言的字母(包括中文)
import regex
text = "Hello 世界 123 こんにちは"
# \p{L} 匹配任何语言的字母
pattern = r"\p{L}+"
# regex.findall() 会返回所有非重叠的匹配项
matches = regex.findall(pattern, text)
print(matches)
# 输出: ['Hello', '世界', 'こんにちは']
示例 2:匹配所有语言的数字
import regex
text = "价格是 100 元,折扣 50%,版本 2.0 和 3.0"
# \p{N} 匹配任何语言的数字
pattern = r"\p{N}+"
matches = regex.findall(pattern, text)
print(matches)
# 输出: ['100', '50', '2', '0', '3', '0']
示例 3:匹配中日韩汉字(\p{Script=Han})
这是非常实用的一个场景。\p{Han} 专门匹配中日韩统一表意文字(CJK Unified Ideographs)。
import regex
text = "Python 是一种很棒的编程语言,漢字 Kanji 漢字"
# \p{Script=Han} 匹配任何汉字
pattern = r"\p{Script=Han}+"
matches = regex.findall(pattern, text)
print(matches)
# 输出: ['是', '一种', '很', '棒', '的', '编程', '语言', '漢字', 'Kanji', '漢字']
示例 4:匹配特定书写系统的字符
import regex
text = "This is English. これは日本語です。これは中文。"
# \p{Script=Hiragana} 匹配平假名
pattern_hiragana = r"\p{Script=Hiragana}+"
matches_hiragana = regex.findall(pattern_hiragana, text)
print(f"平假名: {matches_hiragana}")
# 输出: 平假名: ['これは', 'です']
# \p{Script=Katakana} 匹配片假名
pattern_katakana = r"\p{Script=Katakana}+"
matches_katakana = regex.findall(pattern_katakana, text)
print(f"片假名: {matches_katakana}")
# 输出: 片假名: []
# \p{Script=Han} 匹配汉字
pattern_han = r"\p{Script=Han}+"
matches_han = regex.findall(pattern_han, text)
print(f"汉字: {matches_han}")
# 输出: 汉字: ['这是', '中文']
示例 5:匹配 Emoji
Emoji 的 Unicode 属性比较复杂,它们通常属于 \p{So}(其他符号)类别,但这个类别也包含很多其他符号,更精确的方式是使用 \p{Emoji}。
import regex
text = "我今天的情绪是 😊,明天将是 🚀!"
# \p{Emoji} 匹配所有 Emoji 字符
pattern = r"\p{Emoji}+"
matches = regex.findall(pattern, text)
print(matches)
# 输出: ['😊', '🚀']
re 库 vs regex 库总结
| 特性 | re (Python 内置) |
regex (推荐) |
|---|---|---|
| Unicode 属性 | 支持极差,仅支持 \w, \s, \d 的 Unicode 意义,不支持 \p{}。 |
完整支持。\p{L}, \p{N}, \p{Script=Han} 等都能正常工作。 |
| 性能 | 内置库,性能很好。 | 性能与 re 相当,甚至可能更快。 |
| 功能 | 标准 PCRE 功能。 | re 的超集,并增加了许多强大功能(如模糊匹配、嵌套量词等)。 |
| 依赖 | 无需安装,Python 内置。 | 需要通过 pip install regex 安装。 |
- 如果你只是做一些简单的、非多语言的文本匹配,
re库足够了。 - 只要你需要处理任何形式的多语言文本(中文、日文、韩文、Emoji 等),或者需要根据字符的 Unicode 属性进行精确匹配,请务必使用
regex库。
额外技巧:使用 Unicode 转义序列
如果你不知道某个字符的写法,但知道它的 Unicode 码点(如 \u4e2d 代表“中”),可以在正则表达式中使用转义序列。
\uXXXX:4 位十六进制码点(用于 BMP 字符平面)\UXXXXXXXX:8 位十六进制码点(用于辅助平面字符,如 Emoji)
示例:
import regex
# "中" 的 Unicode 码点是 U+4E2D
# "😊" 的 Unicode 码点是 U+1F60A
text = "中国"
pattern = r"\u4e2d\u56fd" # 匹配 "中国"
match = regex.fullmatch(pattern, text)
if match:
print("匹配成功!") # 输出: 匹配成功!
- Python 3 默认 Unicode:无需特殊设置即可处理 Unicode 字符串。
- 直接匹配:适用于已知的特定字符,如
r"你好"或r"😊"。 - 首选
regex库:对于复杂的 Unicode 处理,regex库是标准答案。 - 核心是
\p{...}:使用\p{L}匹配所有字母,\p{N}匹配所有数字,\p{Script=Han}匹配汉字,\p{Emoji}匹配 Emoji,这是最强大、最灵活的方式。 re库的局限:内置的re库对 Unicode 的支持远不如regex库强大,不推荐用于国际化场景。
