我有一个带有组合变音符号的 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"
aóooz
(看起来 SO markdown 处理器在上面的组合变音符号时遇到了问题,但最后一行有一个 ́ )
无论如何,有没有可以将变音符号与组合相匹配\w
?我不想规范化文本,因为该文本来自文件名,而且我还不想进行整个“文件名 unicode 规范化”。这是Python 2.5。
我刚刚注意到一个新的“regex“ pypi 上的包。(如果我理解正确的话,这是一个新包的测试版本,有一天将取代 stdlibre
包裹)。
它似乎(除其他外)关于 unicode 有更多的可能性。例如,它支持\X
,用于匹配单个字素(无论是否使用组合)。它还支持 unicode 属性、块和脚本的匹配,因此您可以使用\p{M}
指组合标记。这\X
前面提到的相当于\P{M}\p{M}*
(不是组合标记的字符,后跟零个或多个组合标记)。
请注意,这使得\X
或多或少相当于unicode.
,不属于\w
,所以在你的情况下,\w\p{M}*
就是你所需要的。
它(目前)是一个非 stdlib 包,我不知道它准备得如何(并且它不是二进制发行版),但您可能想尝试一下,因为它似乎是您问题的最简单/最“正确”的答案。 (否则,我认为您需要明确使用字符范围,如我对上一个答案的评论中所述)。
也可以看看这一页有关 unicode 正则表达式的信息,可能还包含一些对您有用的信息(并且可以作为 regex 包中实现的某些内容的文档)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)