2024-09-28 05:23:09 发布
网友
如果我有一个包含组合字符的Python Unicode字符串,len报告一个与“seen”字符数不对应的值。在
len
例如,如果我有一个组合了上划线和下划线的字符串,例如u'A\u0332\u0305BC',len(u'A\u0332\u0305BC')报告5个字符;但是显示的字符串只有3个字符长。在
u'A\u0332\u0305BC'
len(u'A\u0332\u0305BC')
我如何获得“可见的”—即用户看到的字符串所占据的不同位置的数目—在Python中包含组合字形的Unicode字符串的长度?在
^{} module有一个函数combining,可用于确定单个字符是否为组合字符。如果它返回0,则可以将字符计数为非组合字符。在
combining
0
import unicodedata len(u''.join(ch for ch in u'A\u0332\u0305BC' if unicodedata.combining(ch) == 0))
或者,稍微简单一点:
如果您的regex风格支持匹配grapheme,那么可以使用\X
\X
Demo
虽然默认的Python re模块不支持\X,但Matthew Barnett的regex module支持:
>>> len(regex.findall(r'\X', u'A\u0332\u0305BC')) 3
在Python2上,您需要在模式中使用u:
u
组合字符不是唯一的零宽度字符:
>>> sum(1 for ch in u'\u200c' if unicodedata.combining(ch) == 0) 1
("\u200c"或""是零宽度非连接符;它是非打印字符。)
"\u200c"
""
在这种情况下,regex模块不工作:
我找到了正确处理上述情况的wcwidth:
>>> from wcwidth import wcswidth >>> wcswidth(u'A\u0332\u0305BC') 3 >>> wcswidth(u'\u200c') 0
但在用户596219的示例中似乎仍然不起作用:
>>> wcswidth('각') 4
^{} module 有一个函数
combining
,可用于确定单个字符是否为组合字符。如果它返回0
,则可以将字符计数为非组合字符。在或者,稍微简单一点:
^{pr2}$如果您的regex风格支持匹配grapheme,那么可以使用
\X
Demo
虽然默认的Python re模块不支持
\X
,但Matthew Barnett的regex module支持:在Python2上,您需要在模式中使用
^{pr2}$u
:组合字符不是唯一的零宽度字符:
(
"\u200c"
或""
是零宽度非连接符;它是非打印字符。)在这种情况下,regex模块不工作:
^{pr2}$我找到了正确处理上述情况的wcwidth:
但在用户596219的示例中似乎仍然不起作用:
相关问题 更多 >
编程相关推荐