一个用于在Python 3字符串中规范化空白符和Unicode组合形式的简单包
项目描述
textnorm
一个用于在Python 3字符串中规范化空白符和Unicode组合形式的简单包。
该包提供两个函数,如下所示。扩展使用示例可以在tests/tests.py
中找到。
normalize_space
此函数接受一个Python 3字符串参数(v
),并返回一个Python字符串,其中v
中找到的每个连续的一或多个空白字符序列都已被折叠为单个空白字符。
基本用法很简单,就像
from textnorm import normalize_space
s = ' There was an\tOld \tMan in a tree,\t\t'
n = normalize_space(s)
print('"{}"'.format(n))
这会产生如下输出
"There was an Old Man in a tree,"
默认情况下,像换行符(\n
)这样的字符被视为任何其他空白字符,因此使用如下
s = """I’m now arrived—thanks to the gods!—
Thro’ pathways rough and muddy,
A certain sign that makin roads
Is no this people’s study: """
print('"{}"'.format(normalize_space(s)))
会产生如下结果
"I’m now arrived—thanks to the gods!— Thro’ pathways rough and muddy, A certain sign that makin roads Is no this people’s study:"
可以使用可选关键字参数(preserve
)来指定一个空白字符列表,这些字符将被保留不变。因此,可以保留前一个示例中的字符串中的换行符,同时规范化其余空白符
print('"{}"'.format(normalize_space(s, preserve = ['\n'])))
这将产生
"I’m now arrived—thanks to the gods!—
Thro’ pathways rough and muddy,
A certain sign that makin roads
Is no this people’s study:"
另一个可选的参数关键字(trim
)可以用来调整处理输入字符串开头和结尾空白字符的方式。在preserve
参数中指定的前导和尾随字符始终受到保护,但否则trim=True
(默认值)确保结果字符串没有前导或尾随空白字符。如果输入字符串有前导或尾随空白字符,并且将trim
设置为False
,则结果字符串将包含一个单空格字符,对应于原始的前导/尾随空白字符,或者是从原始字符串复制的保留空白字符序列。例如
s = '\t\n orange '
print('"{}"'.format(normalize_space(s, trim=False)))
产生
" orange "
和
s = '\t\n orange '
print('"{}"'.format(normalize_space(s, preserve=['\n'], trim=False)))
产生
"
orange "
但是
s = '\t\n orange '
print('"{}"'.format(normalize_space(s, trim=True))) # default
产生
"orange"
normalize_unicode
第二个函数封装了标准库中的unicodedata.normalize
,增加了少量额外的功能。其主要目的仍然是保留unicodedata.normalize
的目的,即返回函数提供的Unicode字符串的指定规范形式('NFC', 'NFD', 'NFKC', 'NFKD')。
Unicode规范化的解释超出了本readme文件的范围;然而,我可以推荐以下内容作为进一步阅读
textnorm.normalize_unicode
的基本用法如下
from textnorm import normalize_unicode
s_nfc = 'μ\u03adγα βιβλ\u03afον μ\u03adγα κακ\u03ccν' # NB: "composed" forms of accented characters
n_nfd = normalize_unicode(s_nfc, 'NFD')
n_nfc = normalize_unicode(n_nfd, 'NFC')
print(s_nfc == n_nfd)
print(s_nfc == n_nfc)
print('original NFC: "{}"'.format(s_nfc))
print('normalized NFD: "{}"'.format(n_nfd))
print('round-tripped NFC: "{}"'.format(n_nfc))
这将产生如下输出
False
True
original NFC: "μέγα βιβλίον μέγα κακόν"
normalized NFD: "μέγα βιβλίον μέγα κακόν"
round-tripped NFC: "μέγα βιβλίον μέγα κακόν"
尽管现代软件和字体相当不错,使得NFC和NFD形式看起来相同,但如果检查底层编码,您会发现这些差异是真实的。
增加的功能:兼容性检查
除了unicodedata.normalize提供的功能之外,textnorm.normalize_unicode还有一个check_compatible
参数,如果设置为True
,则触发目标规范化形式与相应“兼容”形式的比较(即比较'NFC'与'NFKC',以及'NFD'与'NFKD')。如果“规范”和“兼容”形式不同,函数将引发带有诊断信息的ValueError
。调用程序可以捕获此异常,然后实施双重检查或监督。
月牙形西格玛('Ϲ' == '\u03f9')提供了一个很好的方式来演示这种行为,因为规范形式(NFC和NFD)保留字符,但“兼容”形式(NFKC和NFKD)将其转换为传统西格玛('Σ' == '\u03a3')。首先,我们将进行不带测试的转换
s = '\u03f9υρβανή' # i.e. Ϲυρβανή
n = normalize_unicode(s, 'NFKC')
print(n)
我们得到
Συρβανή
但是,如果我们激活测试
s = '\u03f9υρβανή' # i.e. Ϲυρβανή
n = normalize_unicode(s, 'NFKC', check_compatible=True)
我们将得到有用的跟踪回溯
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/paregorios/Documents/files/T/textnorm/textnorm/__init__.py", line 93, in normalize_unicode
raise ValueError(msg)
ValueError: Unicode normalization may have changed the string "Ϲυρβανή" in an undesireable way or may have failed to do so in a manner desired. The NFKC normalized form "Συρβανή" (b'\\N{GREEK CAPITAL LETTER SIGMA}\\N{GREEK SMALL LETTER UPSILON}\\N{GREEK SMALL LETTER RHO}\\N{GREEK SMALL LETTER BETA}\\N{GREEK SMALL LETTER ALPHA}\\N{GREEK SMALL LETTER NU}\\N{GREEK SMALL LETTER ETA WITH TONOS}') does not match the corresponding NFC form "Ϲυρβανή" (b'\\N{GREEK CAPITAL LUNATE SIGMA SYMBOL}\\N{GREEK SMALL LETTER UPSILON}\\N{GREEK SMALL LETTER RHO}\\N{GREEK SMALL LETTER BETA}\\N{GREEK SMALL LETTER ALPHA}\\N{GREEK SMALL LETTER NU}\\N{GREEK SMALL LETTER ETA WITH TONOS}').
等等
欢迎在问题跟踪器上提交pull请求和新建ticket。
本readme文件已由对https://www.poets.org和罗伯特·彭斯、爱德华·列尔的幽灵的感谢和道歉创建。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪一个,请了解有关安装包的更多信息。