杰瑞科技汇

python unicode 正则

核心要点

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

python unicode 正则-图1
(图片来源网络,侵删)

直接匹配 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 unicode 正则-图2
(图片来源网络,侵删)

重要提示:

  • 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("匹配成功!") # 输出: 匹配成功!
  1. Python 3 默认 Unicode:无需特殊设置即可处理 Unicode 字符串。
  2. 直接匹配:适用于已知的特定字符,如 r"你好"r"😊"
  3. 首选 regex:对于复杂的 Unicode 处理,regex 库是标准答案。
  4. 核心是 \p{...}:使用 \p{L} 匹配所有字母,\p{N} 匹配所有数字,\p{Script=Han} 匹配汉字,\p{Emoji} 匹配 Emoji,这是最强大、最灵活的方式。
  5. re 库的局限:内置的 re 库对 Unicode 的支持远不如 regex 库强大,不推荐用于国际化场景。
分享:
扫描分享到社交APP
上一篇
下一篇