Python 正则表达式匹配 Unicode 属性
- 2025-01-14 08:50:00
- admin 原创
- 123
问题描述:
Perl 和一些其他当前的正则表达式引擎支持正则表达式中的 Unicode 属性,例如类别。例如,在 Perl 中,您可以使用p{Ll}
来匹配任意小写字母,或p{Zs}
任何空格分隔符。我没有在 Python 的 2.x 和 3.x 版本中看到对此的支持(非常遗憾)。有人知道获得类似效果的好策略吗?欢迎提出自己开发的解决方案。
解决方案 1:
regex模块(标准模块的替代品re
)支持带有语法的 Unicode 代码点属性p{}
。
解决方案 2:
您是否尝试过Ponyguruma,这是绑定到Oniguruma正则表达式引擎的 Python 工具?在该引擎中,您可以简单地说p{Armenian}
匹配亚美尼亚字符。p{Ll}
或者p{Zs}
也可以。
解决方案 3:
您可以在每个字符上精心使用 unicodedata:
import unicodedata
def strip_accents(x):
return u''.join(c for c in unicodedata.normalize('NFD', x) if unicodedata.category(c) != 'Mn')
解决方案 4:
说到自主开发的解决方案,前段时间我编写了一个小程序来做这件事 - 将写为 的 unicode 类别转换为从 unicode规范p{...}
(v.5.0.0)中提取的一系列值。仅支持类别(例如:、),并且仅限于 BMP。我将其发布在这里以防有人觉得它有用(尽管 Oniguruma 确实似乎是一个更好的选择)。L
`Zs`
使用示例:
>>> from unicode_hack import regex
>>> pattern = regex(r'^\\p{Lu}(\\p{L}|\\p{N}|_)*')
>>> print pattern.match(u'疂_1+2').group(0)
疂_1
>>>
这是源代码。还有一个JavaScript 版本,使用相同的数据。
解决方案 5:
您说得对,Python 正则表达式解析器不支持 Unicode 属性类。
如果你想做一个漂亮的黑客,那通常会很有用,你可以创建一个预处理器,扫描字符串以查找此类标记(p{M}
或其他标记)并将它们替换为相应的字符集,例如,p{M}
将变成[/u0300–/u036F/u1DC0–/u1DFF/u20D0–/u20FF/uFE20–/uFE2F]
,并且P{M}
将变成[^/u0300–/u036F/u1DC0–/u1DFF/u20D0–/u20FF/uFE20–/uFE2F]
。
人们会感谢你的。:)
解决方案 6:
请注意,虽然p{Ll}
在 Python 正则表达式中没有等效项,但p{Zs}
应该由 覆盖'(?u)s'
。(?u)
正如文档所述,“使 \w、\W、\b、\B、\d、\D、\s 和 \S 依赖于 Unicode 字符属性数据库。” 和s
表示任何空格字符。
扫码咨询,免费领取项目管理大礼包!