unicodedata 是 Python 提供的 Unicode 数据处理模块,支持访问字符的 Unicode 编码属性,如名称、分类、数字值、标准化形式等。它广泛应用于文本处理、字符过滤、数据清洗和多语言文本标准化中。
常见应用场景:
(1)判断字符是否是数字、字母、符号等。
(2)获取字符的 Unicode 名称或类别。
(3)将字符标准化为 NFC/NFD/NFKC/NFKD 形式。
(4)将全角字符转换为半角(或反之)。
(5)构建支持国际字符的文本处理系统。
◆ ◆ ◆
核心概念
1、Unicode 字符集
为全球所有语言的字符分配唯一编号(码位),以十六进制形式表示,如 U+4E2D 表示汉字“中”。
2、字符类别(Category)
字符按功能分组,如字母 (L)、数字 (N)、标点符号 (P)、符号 (S) 等。
3、标准化(Normalization)
将语义相同但表示不同的字符序列转换为一致的形式,如拉丁字母 é 可以写作 é 或 e + ´,标准化后可统一处理。
4、全角半角转换
可利用字符名称或分类特征进行转换,如中文输入法中的全角标点需转换为半角用于程序识别。
◆ ◆ ◆
应用举例
例 1:查看字符的 Unicode 名称与分类
import unicodedata
ch = '你'print(unicodedata.name(ch)) # CJK UNIFIED IDEOGRAPH-4F60print(unicodedata.category(ch)) # Lo(其他字母)例 2:查找字符并验证是否是字母
import unicodedata
char = unicodedata.lookup("LATIN SMALL LETTER A")print(char) # aprint(unicodedata.category(char)) # Ll(小写字母)例 3:处理带上标数字的字符
import unicodedata
char = '²'print(unicodedata.name(char)) # SUPERSCRIPT TWOprint(unicodedata.digit(char)) # 2例 4:标准化字符表示形式
s1 = 'é' # 单个字符s2 = 'e\u0301' # e + 组合符号 ´
import unicodedataprint(s1 == s2) # Falseprint(unicodedata.normalize('NFC', s1) == unicodedata.normalize('NFC', s2)) # True例 5:判断字符是否为数字或空格
import unicodedata
c1 = '9' # 全角 9c2 = ' '
print(unicodedata.category(c1)) # Nd(数字)print(unicodedata.decimal(c1)) # 9
print(unicodedata.category(c2)) # Zs(空格)◆ ◆ ◆
常用函数速览
unicodedata.bidirectional(char)
获取字符的双向类别(bidirectional class),用于处理从右到左语言(如阿拉伯语)的排版控制。
参数:
char:单个 Unicode 字符
返回:
字符串,表示字符的双向类别,如 "L" 表示从左到右,"R" 表示从右到左
unicodedata.category(char)
返回字符的通用分类(General Category),如大写字母、标点、符号等。
参数:
char:单个 Unicode 字符
返回:
字符串,如 'Lu'(大写字母),'Nd'(数字),'Zs'(空格)等
unicodedata.combining(char)
判断字符是否为 Unicode 组合字符(combining character),即不能单独出现的附加符号(如声调)。
参数:
char:单个 Unicode 字符
返回:
整数,如果为 0 表示不是组合字符,非 0 表示是
unicodedata.decimal(char[, default])
获取字符的十进制值(仅适用于 Unicode 数字字符,如 '③' → 3)。
参数:
char:单个 Unicode 字符
default:可选,为无法转换时的默认值
返回:整数值或 default
unicodedata.digit(char[, default])
获取字符的整数值(包括罗马数字、圈号数字等)。与 decimal() 类似,但更宽松。
参数:
char:单个 Unicode 字符
default:可选,为无法转换时的默认值
返回:整数值或 default
unicodedata.lookup(name)
通过 Unicode 名称查找对应字符。
参数:
name:字符串,例如 'GREEK SMALL LETTER ALPHA'
返回:对应的字符,如 'α'
异常:查不到会抛出 KeyError
unicodedata.mirrored(char)
判断字符是否为镜像字符(如括号、箭头等)。
参数:
char:单个 Unicode 字符
返回:整数 1(是)或 0(否)
unicodedata.name(char[, default])
获取字符的 Unicode 官方名称。
参数:
char:单个 Unicode 字符
default:可选,为无法转换时的默认值
返回:
字符串名称,如 'LATIN CAPITAL LETTER A'。若名称不存在则返回 default
unicodedata.normalize(form, unistr)
将字符串规范化为特定的 Unicode 形式。用于解决不同字符组合可能视觉相同的问题。
参数:
form:字符串,取值为 'NFC'、'NFD'、'NFKC'、'NFKD'
unistr:待处理字符串
返回:规范化后的字符串
unicodedata.numeric(char[, default])
获取字符的数字值(适用于所有含数值含义的字符,如分数、数量词等)。
参数:
char:单个 Unicode 字符
default:可选,为无法转换时的默认值
返回:浮点数或 default
特别说明:字符判断函数示例
下面是基于 unicodedata.category() 实现的常见字符类型判断函数(非官方封装):
import unicodedata
def is_emoji(char): # 判断是否为 emoji 表情符号 # Unicode 类别为 'So'(Symbol, other),并且排除 ASCII 范围 return 'So' == unicodedata.category(char) and not char.isascii()
def is_chinese(char): # 判断是否为常见汉字(CJK 统一汉字) # 范围为 U+4E00 ~ U+9FFF return '\u4e00' <= char <= '\u9fff'
def is_latin(char): # 判断是否为拉丁字符 # 条件是字符名称中包含 "LATIN" return 'LATIN' in unicodedata.name(char, '')
def is_punctuation(char): # 判断是否为标点符号 # Unicode 类别以 'P' 开头表示标点类(Punctuation) return unicodedata.category(char).startswith('P')
def is_whitespace(char): # 判断是否为空白字符(空格等) # Unicode 类别为 'Zs'(Separator, space) return unicodedata.category(char) == 'Zs'◆ ◆ ◆
补充说明
1、unicodedata 不包含字符转换(如大小写转换、全角转半角),这部分可通过 str.lower()、手动映射或 japanese 等库处理。
2、若字符无数值,则 decimal()、digit()、numeric() 会抛出 ValueError,可传入 default 参数避免异常。
3、建议在多语言应用、数据清洗、文本标准化等场景使用 normalize()。

“点赞有美意,赞赏是鼓励”
902

被折叠的 条评论
为什么被折叠?



