您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python中的Perl兼容正则表达式(PCRE)

Python中的Perl兼容正则表达式(PCRE)

Python如何处理模式和字符串中的非ASCII或未能处理非ASCII时,确实存在一些细微的问题。更糟糕的是,这些差异不仅取决于您使用的是哪个版本的Python,还取决于您是否拥有“广泛的构建”。

通常,当您处理Unicode时, 而构建较窄的Python 2效果最差,但与Perl正则表达式 相对于 Unicode的工作方式相比,所有组合仍然相差甚远。如果要在Python中查找????模式,则可能需要比其旧re模块更进一步。

只要您使用足够高级的Python版本,就可以 所有令人烦恼的“广泛构建”问题。这是v3.3发行说明的摘录:

PEP 393引入的更改如下:

与标准Python发行版re库中当前可用的库相比,Matthew Barnett的regex同时适用于Python 2和Python 3的模块在几乎所有可能的方式上都好得多,并且会re最终被替换。与您的问题特别相关的是,他的regex库在各个方面都比现在更加强大(即与 得多re),这将使您更容易将Perl正则表达式移植到Python。因为它是完全重写(例如,从头开始,而不是在汉堡包中),所以它是在考虑非ASCII的情况下写的,而re不是这样。

regex因此,该库在如何处理事物方面更严格地遵循UTS#18(Unicode正则表达式)的(当前)建议。它在大多数情况下(即使不是全部)都 ,这通常是您必须使用ICU regex库或Perl本身的东西–或者,如果您特别有胆量,则对它的正则表达式进行新的Java 7更新,例如也符合UTS#18的一级要求

除了满足那些对基本Unicode支持绝对是必不可少的,但regex满足的第一级要求之外 该强大的库还满足了RL2.5命名字符(\N{...})),RL2.2扩展字素的第二级要求。集群(\X),以及来自UTS#18修订版14的新的RL2.7,关于完全属性

Matthew的regex模块还进行Unicode大小写折叠,因此区分大小写的匹配在Unicode上可靠地起作用, Unicode

以下不再是正确的,因为regex现在支持完整的Unicode大小写折叠,例如Perl和Ruby。

一个非常小的区别是,目前,Perl的不区分大小写的模式使用完整的面向字符串的大小写折叠,而他的 regex模块仍使用简单的面向单个字符的大小写折叠,但这是他正在研究的问题。这实际上是 一个非常棘手的问题,除了Perl之外,甚至只有Ruby都会尝试。

下充分casefolding,这意味着(例如)"ß"现在是正确的匹配"SS""ss""??""?s"(等)当选择不区分大小写匹配。(这在希腊语中比在拉丁语中更重要。)

另请参阅我第三次OSCON2011演讲中幻灯片或doc源代码标题为 _“ ”,_以获取有关JavaScript,PHP,Go,Ruby,Python,Java的Unicode支持的一般问题。和Perl。如果不能使用Perl正则表达式或ICU正则表达式库(可惜没有命名捕获),那么Matthew的regexPython可能就是您的最佳选择。

N???B???s.?.?。(= s’il vousplaît等) :Python库的作者实际上 并未 在下面放置未经请求的非商业性非广告regex。:)

Pythonregex库具有 ,其中一些在其他正则表达式系统中找不到。无论您是偶然使用它来获得它的坚固性还是出色的Unicode支持,这些都非常值得一试。

该模块感兴趣的一些杰出功能包括

好的,这已经足够炒作了。:)

如果您是正则表达式怪胎,那么值得一看的最后一个替代方法是将Python库绑定到Russ Cox出色的RE2库。它还本地支持Unicode,包括简单的基于字符的大小写折叠,并且与之不同的re是,它同时提供了Unicode常规类别和Unicode脚本字符属性,这是更简单的Unicode处理最常需要的两个关键属性

尽管RE2错过了一些Unicode特性,例如\N{...}ICU,Perl和Python中的命名字符支持,但是RE2具有非常重要的计算优势,当您担心基于饥饿的拒绝服务时,它便成为 通过Web查询等中的正则表达式进行攻击。它通过禁止反向引用来管理此问题,这会导致正则表达式停止正常运行,并有可能在时间和空间上发生超指数爆炸。

RE2的库绑定不仅适用于C / C ++和Python,还适用于Perl,尤其是Go(适用于Go),后者打算很快替换那里的标准正则表达式库。

python 2022/1/1 18:35:36 有262人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶