蟒正则表达式匹配Unicode属性蟒正则表达式匹配Unicode属性(Python regex ma

2019-05-08 18:47发布

Perl和其他一些当前的正则表达式引擎支持Unicode属性,如类别,在一个正则表达式。 例如,在Perl中你可以使用\p{Ll}匹配任意小写字母,或p{Zs}任何空格分隔符。 我看不出在Python中的任何2.x的,也不3.X线这一支持(由于遗憾)。 是任何人知道一个很好的策略,以获得类似的效果吗? 自制的解决方案是受欢迎的。

Answer 1:

您是否尝试过Ponyguruma ,一个Python绑定到Oniguruma正则表达式引擎? 在发动机,你可以简单地说\p{Armenian}匹配亚美尼亚字符。 \p{Ll}\p{Zs}工作过。



Answer 2:

该正则表达式模块(与标准的替代re模块)支持与Unicode的码点属性\p{}语法。



Answer 3:

你可以在每个角色煞费苦心使用unicodedata:

import unicodedata

def strip_accents(x):
    return u''.join(c for c in unicodedata.normalize('NFD', x) if unicodedata.category(c) != 'Mn')


Answer 4:

说到自主开发的解决方案,前一段时间我写了一个小程序来做到这一点-写转换为Unicode类别\p{...}到值的范围,从Unicode的提取规范 (v.5.0.0)。 只有类别支持(例如: LZs ),并仅限于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
>>>

这里的来源 。 还有一个JavaScript版本 ,使用相同的数据。



Answer 5:

你说得对,Unicode的财产类不是由Python正则表达式解析器的支持。

如果你想做一个好的黑客,这将是通常有用,你可以创建一个扫描这种类令牌的字符串(预处理器\p{M}或其他),并与相应的字符集替换它们,因此,对于例如, \p{M}将成为[\u0300–\u036F\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F] ,和\P{M}将成为[^\u0300–\u036F\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F]

人们会感谢你。 :)



Answer 6:

请注意,虽然\p{Ll}在Python的正则表达式没有等价的, \p{Zs}应通过覆盖'(?u)\s' 。 的(?u)作为文档说,“使\ W,\ W,\ B,\ B,\ d,\ d,\ S和\ S依赖于Unicode字符属性数据库上。”和\s是指任何空格字符。



文章来源: Python regex matching Unicode properties