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

python regex匹配unicode属性

  •  51
  • ThomasH  · 技术社区  · 16 年前

    Perl和其他一些当前的regex引擎支持unicode属性,例如regex中的类别。例如,在Perl中,您可以使用 \p{Ll} 匹配任意小写字母,或 p{Zs} 对于任何空格分隔符。在Python的2.x行和3.x行中,我都没有看到对此的支持(我有点遗憾)。有人知道一个好的策略来获得类似的效果吗?欢迎国内解决方案。

    6 回复  |  直到 11 年前
        1
  •  23
  •   yamm    11 年前

    你试过了吗? Ponyguruma ,一个绑定到 Oniguruma 正则表达式引擎?在那个引擎里你可以简单地说 \p{Armenian} 以匹配亚美尼亚字符。 \p{Ll} 或 \p{Zs} 也要工作。

        2
  •  56
  •   ronnix    15 年前

    这个 regex 模块(替代标准 re 模块)支持具有 \p{} 语法。

        3
  •  6
  •   zellyn    15 年前

    您可以在每个字符上刻意使用unicodedata:

    import unicodedata
    
    def strip_accents(x):
        return u''.join(c for c in unicodedata.normalize('NFD', x) if unicodedata.category(c) != 'Mn')
    
        4
  •  5
  •   Community Mohan Dere    9 年前

    说到本土的解决方案,前一段时间我写了一篇 program 为此-转换一个Unicode类别 \p{...} 从Unicode中提取的一系列值 specification (5.5.0)。仅支持类别(例如: L , Zs ,并且仅限于BMP。我把它贴在这里,以防有人发现它有用(尽管Oniguruma确实是一个更好的选择)。

    示例用法:

    >>> from unicode_hack import regex
    >>> pattern = regex(r'^\\p{Lu}(\\p{L}|\\p{N}|_)*')
    >>> print pattern.match(u'疂_1+2').group(0)
    疂_1
    >>>
    

    这里是 source . 还有一个 JavaScript version ,使用相同的数据。

        5
  •  4
  •   Jonathan Feinberg    16 年前

    python regex解析器不支持unicode属性类是正确的。

    如果你想做一个不错的黑客,这通常是有用的,你可以创建一个预处理器来扫描一个字符串来获取类标记。( \p{M} 或者其他)并用相应的字符集替换它们,例如, \p{M} 将成为 [\u0300–\u036F\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F] 和 \P{M} 将成为 [^\u0300–\u036F\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F] .

    人们会感谢你的。:)

        6
  •  2
  •   tzot    16 年前

    注意,同时 \p{Ll} 在python正则表达式中没有等价的, \p{Zs} 应该包括 '(?u)\s' . 这个 (?u) 如文档所说,make \w、\w、\b、\b、\d、\d、\s和\s依赖于Unicode字符属性数据库。 \s 表示任何间隔字符。