Python 库手册:unicodedata Unicode 字符处理模块

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()。

图片

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值