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

有帮助吗?

解决方案

你有没有尝试过 马驹, ,Python 绑定到 鬼古鲁玛 正则表达式引擎?在那个引擎中你可以简单地说 \p{Armenian} 匹配亚美尼亚字符。 \p{Ll} 或者 \p{Zs} 也工作。

其他提示

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

可以在每个字符精心使用unicodedata:

import unicodedata

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

自制的解决方案的说到,前一段时间我写了一个小活动要做到这一点 - 转换写成\p{...}一个Unicode类别为值的范围,从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的版本,使用相同的数据。

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

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

人们会感谢你。 :)

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top