代码之家  ›  专栏  ›  技术社区  ›  Amandasaurus

Python regex\w与组合音调符号不匹配?

  •  8
  • Amandasaurus  · 技术社区  · 14 年前

    我有一个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
    

    (看起来如此降价的处理器在组合上面的音调符号方面有问题,但是最后一行有一个)

    有没有什么东西可以把变音符号和 \w型

    2 回复  |  直到 14 年前
        1
  •  6
  •   Steven    14 年前

    我刚注意到一个新的“ regex re 包装)。

    在unicode方面,它似乎有更多的可能性。例如,它支持 \X ,用于匹配单个grapheme(无论是否使用组合)。它还支持unicode属性、块和脚本的匹配,因此您可以使用 \p{M} 指组合标记。这个 \十 前面提到的相当于 \P{M}\p{M}* (不是组合符号的字符,后跟零个或多个组合符号)。

    注意,这使得 \十 差不多相当于 . \w 对你来说, \w\p{M}*

    它(目前)是一个非stdlib包,我不知道它准备得有多好(而且它不是二进制发行版),但是您可能想尝试一下,因为它似乎是对您的问题最简单/最“正确”的答案(否则,我认为您应该明确地使用字符范围,如我对上一个答案的评论所述)。

    另请参见 this page 有了关于unicode正则表达式的信息,它还可能包含一些对您有用的信息(并且可以作为regex包中实现的一些东西的文档)。

        2
  •  2
  •   Steven    14 年前

    你可以用 unicodedata.normalize 把变音符号组合成一个unicode字符。

    >>> import re
    >>> from unicodedata import normalize
    >>> re.match(u"a\w\w\wz", normalize("NFC", u"aoo\u0301oz"), re.UNICODE)
    <_sre.SRE_Match object at 0x00BDCC60>
    

    我知道你说过你不想规范化,但我认为这个解决方案不会有问题,因为你只是规范化要匹配的字符串,而不必更改文件名本身或其他什么。