Python正则表达式匹配Unicode属性

Tho*_*asH 55 python regex unicode ucd character-properties

Perl和其他一些当前的正则表达式引擎在正则表达式中支持Unicode属性,例如类别.例如,在Perl中,您可以使用\p{Ll}匹配任意小写字母或p{Zs}任何空格分隔符.在Python的2.x和3.x行中都没有看到对此的支持(有应有的遗憾).是否有人意识到获得类似效果的好策略?欢迎本土解决方案.

ron*_*nix 57

正则表达式模块(与标准的备选re模块)支持与Unicode的码点属性\p{}的语法.

  • +1:`regex`是stdlib的`re`模块的替代品.如果你知道如何使用`re`; 你马上就可以使用`regex`.`import regex as re`,你有`\ p {}`语法支持.这是一个[如何使用`\ p {P}删除字符串中所有标点符号的示例](http://stackoverflow.com/a/11066687) (4认同)

joe*_*ker 23

您是否尝试过Ponyguruma,一个绑定Oniguruma正则表达式引擎的Python ?在该引擎中,您可以简单地说\p{Armenian}匹配亚美尼亚字符.\p{Ll}或者\p{Zs}工作.

  • Ponyguruma模块的最后提交显然是2010年(http://dev.pocoo.org/hg/sandbox/ponyguruma),而PyPI上的Python正则表达式模块正在积极开发:http://pypi.python.org/pypi/regex (8认同)
  • 此模块与Python re模块的API不同 (2认同)

zel*_*lyn 6

你可以在每个角色上辛苦使用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)


Jon*_*erg 5

你是对的,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\n

人们会感谢你的。:)

\n


mgi*_*nbr 5

说到本土解决方案,前段时间我写了一个小程序就是这样做 - 将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版本,使用相同的数据.

  • 很好,尽管您在代码中使用手工制作的文字来表示范围。如果这些文字能够从规范的某种文本形式生成,那就太好了。或者来自 unicodedata (http://docs.python.org/library/unicodedata.html#module-unicodedata)。您可能可以运行所有有效的 unicode 代码点并通过 unicodedata.category() 运行它们,并使用输出来填充地图... (2认同)