检查 unicode 值中的子字符串

问题描述 投票:0回答:2

假设我在 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”还是任何其他字母。

python unicode substring
2个回答
2
投票

您误解了您的输入。

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', '')

-1
投票
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()
将单个字符作为参数。因此,您可以在此处使用列表理解

© www.soinside.com 2019 - 2024. All rights reserved.