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)。 只有类别支持(例如: 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
>>>
这里的来源 。 还有一个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
是指任何空格字符。