Python正则表达式匹配Unicode属性
-
11-09-2019 - |
题
Perl 和其他一些当前的正则表达式引擎支持 Unicode 属性,例如正则表达式中的类别。例如。在 Perl 中你可以使用 \p{Ll}
匹配任意小写字母,或者 p{Zs}
对于任何空格分隔符。我在 Python 的 2.x 和 3.x 行中都没有看到对此的支持(遗憾的是)。有人知道有什么好的策略可以达到类似的效果吗?欢迎本土解决方案。
其他提示
在正则表达式模块(到标准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)。只有类别支持(例如: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的版本,使用相同的数据。
您说得对,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
指任何间隔字符。