Ror*_*ory 9 python regex unicode diacritics unicode-normalization
我有一个结合了变音符号的UTF8字符串.我想将它与\w正则表达式序列匹配.它匹配具有重音符号的字符,但如果存在组合变音符号的拉丁字符则不匹配.
>>> re.match("a\w\w\wz", u"aoooz", re.UNICODE)
<_sre.SRE_Match object at 0xb7788f38>
>>> print u"ao\u00F3oz"
aoóoz
>>> re.match("a\w\w\wz", u"ao\u00F3oz", re.UNICODE)
<_sre.SRE_Match object at 0xb7788f38>
>>> re.match("a\w\w\wz", u"aoo\u0301oz", re.UNICODE)
>>> print u"aoo\u0301oz"
ao?ooz
Run Code Online (Sandbox Code Playgroud)
(看起来SO降价处理器在上面的组合变音符号有问题,但最后一行有一个)
反正将变音符号与\w?相匹配?我不想规范化文本,因为这个文本来自文件名,我不想要做一个完整的'文件名unicode规范化'.这是Python 2.5.
我刚刚注意到pypi上的一个新的" 正则表达式 "包.(如果我理解正确的话,那就是有一天会替换stdlib re包的新包的测试版本).
它似乎(尤其)有更多关于unicode的可能性.例如,它支持\X,用于匹配单个字素(无论它是否使用组合).它还支持在unicode属性,块和脚本上进行匹配,因此您可以使用它\p{M}来引用组合标记.在\X前面提到的是相当于\P{M}\p{M}*(一个字符不是一个结合标记,接着是零个或多个组合的标记).
请注意,这\X或多或少会使unicode等效.,而不是\w,因此在您的情况下,\w\p{M}*就是您所需要的.
它(现在)是一个非stdlib包,我不知道它是多么准备好(它不是二进制发行版),但你可能想尝试一下,因为它似乎是您问题的最简单/最"正确"的答案.(否则,我认为你明确使用字符范围,如我对前一个答案的评论中所述).
另请参阅此页面,其中包含有关unicode正则表达式的信息,这些信息可能还包含一些有用的信息(并且可以作为regex软件包中实现的一些内容的文档).