Tho*_*asH 55 python regex unicode ucd character-properties
Perl和其他一些当前的正则表达式引擎在正则表达式中支持Unicode属性,例如类别.例如,在Perl中,您可以使用\p{Ll}匹配任意小写字母或p{Zs}任何空格分隔符.在Python的2.x和3.x行中都没有看到对此的支持(有应有的遗憾).是否有人意识到获得类似效果的好策略?欢迎本土解决方案.
joe*_*ker 23
您是否尝试过Ponyguruma,一个绑定Oniguruma正则表达式引擎的Python ?在该引擎中,您可以简单地说\p{Armenian}匹配亚美尼亚字符.\p{Ll}或者\p{Zs}工作.
你可以在每个角色上辛苦使用unicodedata:
import unicodedata
def strip_accents(x):
return u''.join(c for c in unicodedata.normalize('NFD', x) if unicodedata.category(c) != 'Mn')
Run Code Online (Sandbox Code Playgroud)
你是对的,Python 正则表达式解析器不支持 Unicode 属性类。
\n\n如果你想做一个很好的黑客,这通常是有用的,你可以创建一个预处理器来扫描字符串中的此类标记(\\p{M}或其他)并将它们替换为相应的字符集,例如,\\p{M}将变成[\\u0300\xe2\x80\x93\\u036F\\u1DC0\xe2\x80\x93\\u1DFF\\u20D0\xe2\x80\x93\\u20FF\\uFE20\xe2\x80\x93\\uFE2F],并将\\P{M}成为[^\\u0300\xe2\x80\x93\\u036F\\u1DC0\xe2\x80\x93\\u1DFF\\u20D0\xe2\x80\x93\\u20FF\\uFE20\xe2\x80\x93\\uFE2F]。
人们会感谢你的。:)
\n说到本土解决方案,前段时间我写了一个小程序就是这样做 - 将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
>>>
Run Code Online (Sandbox Code Playgroud)
这是源头.还有一个JavaScript版本,使用相同的数据.