假设我在 Python 脚本中有一个具有 unicode 值的变量。
place_name = u'K\u016bla Mountain'
在本例中,
016b
表示在 u
上使用长音符号。我想检查子字符串中是否有“016b”,如果找到,请将 place_name 更改为 u'Kula Mountain'
。如果它只是一个字符串,我可以使用:
if '016b' in place_name:
place_name = 'Kula Mountain'
但这不适用于 unicode 值。检查“016b”的最简单方法是什么,如果找到,请将 place_name 更改为取消编码
u'Kula Mountain'
值?
注意,我尝试过:
if '016b' in ord(alt_map_name):
place_name = u'Kula Mountain'
正如有关此问题的其他帖子所建议的那样,但得到了
Traceback (most recent call last):
File "<string>", line 1, in <module>
TypeError: ord() expected a character, but string of length 16 found
编辑:要明确的是,我只想检查
macron
(0x016b),无论是带有“u”还是任何其他字母。
您误解了您的输入。
016b 不表示“u”上的宏。相反,
\u016b
是一个转义序列,表示十六进制值 016b 的 Unicode 代码点。该代码点恰好是 ū,U+016B 带长音符号的拉丁文小写字母 U,但它是重音“u”这一事实与转义序列中的“u”无关。
您的字符串中没有 0、1、6 或 b。您编写的字符串文字中包含这些字符,但它计算出的字符串中包含
ū
字符。搜索“016b”将找不到匹配项。
如果您想从输入中删除宏宏,您可以应用规范分解将组合字符转换为单独的“u”并组合宏宏 (U+0304 COMBINING MACRON) 代码点,然后删除组合宏宏:
import unicodedata
# NFD normalization applies canonical decomposition, splitting apart composed characters
decomposed_place_name = unicodedata.normalize('NFD', place_name)
# '\u0304' is a combining macron.
place_name_without_macrons = decomposed_place_name.replace('\u0304', '')
place_name = u'K\u016bla Mountain'
if 0x016b in [ord(c) for c in place_name]:
place_name = u'Kula Mountain'
print(place_name)
输出:-
Kula Mountain
在您的情况下,
0x016b
表示字符'u'
的Unicode代码点,并且ord()
将单个字符作为参数。因此,您可以在此处使用列表理解