python - 如何从字符串中获取字符 - 获取错误的字符和错误的字符串长度
问题描述
下面python给出了错误的字符串长度和错误的字符。
这里有人知道吗?
>>> w ='lòng'
>>> w
'lòng'
>>> print (w)
lòng
>>> len(w)
5
>>> for ch in w:
... print (ch + "-")
...
l-
o-
-
n-
g-
>>>
解决方案
这里的问题是,在 unicode 中,某些字符可能由其他字符的组合组成。在这种情况下,“lòng”包括小写“o”和重音符号作为单独的字符。
>>> import unicodedata as ud
>>> w ='lòng'
>>> for c in w:
... print(ud.name(c))
...
LATIN SMALL LETTER L
LATIN SMALL LETTER O
COMBINING GRAVE ACCENT
LATIN SMALL LETTER N
LATIN SMALL LETTER G
这是一个分解的unicode 字符串,因为带重音的 'o' 分解为两个字符。unicodedata模块提供了normalize函数来在分解和组合形式之间进行转换:
>>> for c in ud.normalize('NFC', w):
... print(ud.name(c))
...
LATIN SMALL LETTER L
LATIN SMALL LETTER O WITH GRAVE
LATIN SMALL LETTER N
LATIN SMALL LETTER G
如果您想知道字符串是否被规范化为特定形式,但不想实际规范化它,并且正在使用 Python 3.8+,则可以使用更高效的unicodedata.is_normalized函数(归功于用户 Acumenus):
>>> ud.is_normalized('NFC', w)
False
>>> ud.is_normalized('NFD', w)
True
Python 文档中的Unicode HOWTO包含一个关于比较字符串的部分,其中更详细地讨论了这一点。
推荐阅读
- java - 在 jsp 页面中打印 hashmap 值
- python - Python为未知行数绘制颜色
- python-3.x - 通过另一个字段 mongodb 查找不同的值组
- php - php 脚本根据产品值创建 csv 导出文件
- python - Python-pandas:一个序列的真值是模棱两可的
- ios - 无法重新解析位码包中的目标文件:'无效的位码版本
- php - 检查 PHP 上的 Mysql 数据库中是否存在值
- angular - 当应用程序在后台时,深层链接有效,但在被杀死时无效
- wordpress - Wordpress - 获取具有特定 ACF 值的帖子
- css - CSS 条件分解