我不得不在Python中解析一些基于PCRE的字符串,我不知道该怎么做。
我要分析的字符串如下:
match mysql m/^.\0\0\0\n(4\.[-.\w]+)\0...\0/s p/MySQL/ i/$1/
在本例中,我必须获得以下不同的项:
"m/^.\0\0\0\n(4\.[-.\w]+)\0...\0/s" ; "p/MySQL/" ; "i/$1/"
我在Python中发现的唯一与PCRE操作相关的是这个模块:http://pydoc.org/2.2.3/pcre.html(但它是一个.so文件…)
您知道是否存在用于解析此类字符串的Python模块吗?
因为您想运行PCRE regex,而Python的re模块已经偏离了它最初的PCRE源代码,所以您可能还想签出Arkadiusz Wahlig's Python bindings for PCRE。这样您就可以访问本地PCRE,不需要在regex风格之间进行转换。
你在找
'(\w/[^/]+/\w*)'
。像这样使用
是在玩Edi Weitz的Regex Coach时发现的,所以感谢对这个问题的评论,让我记住了它的存在。
特别注意Python中的非ASCII
Python在模式和字符串中如何处理或未能处理非ASCII存在一些非常微妙的问题。更糟糕的是,这些差异很大程度上取决于您使用的Python版本,还取决于您是否有一个“广泛的构建”。
一般来说,在进行Unicode工作时,具有宽构建的Python 3工作得最好,而具有窄构建的Python 2工作得最差,但是所有的组合与Perl regex相对于Unicode的工作方式仍然相去甚远。如果您要在Python中寻找模式,那么您可能需要比它原来的
re
模块看得更远一些。如果您使用足够高级的Python版本,那么恼人的“广域构建”问题终于得到了彻底的解决。以下是the v3.3 release notes的摘录:
Python正则表达式的未来
与标准Python发行版的} module for both Python 2 and Python 3 alike 在几乎所有可能的方面都要好得多,并且最终很可能会取代
re
库中当前可用的相比,Matthew Barnett’s ^{re
。与您的问题特别相关的是,他的regex
库在各个方面都远比现在的re
库更兼容Perl。因为它是一个基础重写(如从头开始,而不是汉堡:),所以它是在考虑非ASCII的情况下编写的,而不是re
。因此,
regex
库在处理问题的方式上更接近于UTS#18: Unicode Regular Expressions的(当前)建议。它满足或超过了UTS#18 Level 1的要求在大多数情况下,如果不是所有方面,通常必须使用ICU regex库或Perl本身,或者如果您特别勇敢,新的Java 7更新到它的regex,因为这也符合UTS#18的Level One requirements。除了满足那些一级需求(这些需求对于基本的Unicode支持是绝对必要的,但是Python当前的
re
库并不能满足这些需求之外,这个很棒的regex
库还满足RL2.5命名字符(\N{...})
)、RL2.2扩展Grapheme集群(\X
)的二级需求,以及来自revision 14 of UTS#18的完整属性的新RL2.7。Matthew的
regex
模块还执行Unicode casefolding,以便不区分大小写的匹配在Unicode上可靠地工作,而re
不工作。下面不再是正确的,因为
regex
现在支持完整的Unicode casefolding,如Perl和Ruby。在全casefolding下,这意味着(例如)
"ß"
在选择不区分大小写的匹配时,现在可以更正匹配项"SS"
、"ss"
、"ſſ"
、"ſs"
(等等)。(这在希腊语脚本中比拉丁语脚本中更为重要。)另请参阅my third OSCON2011 talk中标题为“Unicode支持Shootout:the Good,the Bad,and the(most)aucky的幻灯片或文档源代码,了解跨JavaScript、PHP、Go、Ruby、Python、Java和Perl的Unicode支持的一般问题。如果不能使用Perl正则表达式或者可能使用ICU正则表达式库(它没有命名的捕获,唉!),那么Matthew为Python编写的
regex
可能是最好的一张照片。NᴏᴛᴀBᴇɴs.ᴠ.ᴘ。(=s'il vous plaît,et mème s'il ne vous plaît pas:)以下未经请求的非商业性非广告实际上是Python库作者放在这里的。:)
酷
regex
功能Python
regex
库具有大量的超纯特性,其中一些特性在任何其他regex系统中都找不到。不管你是不是碰巧用它来做ess或其一流的Unicode支持。本模块的一些突出特点是:
ismx
类型的选项,因此(?i:foo)
仅用于foo的casefold,而不用于overall,或者(?-i:foo)
仅在foo上关闭它。这就是Perl的工作原理(或者可以)。agrep
和glimpse
也有)\L<list>
插值隐式最短到最长排序命名列表\m
,\M
)\R
有些不情愿。(\w+\s+)+
这样的重复捕获组,在这里您可以获得第一个组的所有单独匹配项,而不仅仅是最后一个匹配项。(我相信C也会这么做。)@+
和@-
数组。(?|...|...|...|)
按照Perl中的工作方式重置每个分支中的组编号。\w
、\b
、\s
,以及对Unicode的处理。\X
。\G
连续点断言。re
只有32位索引)。好吧,那就够炒作了。:)
又一个不错的备用Regex引擎
如果你是一个regex极客的话,最后一个值得关注的选择是对Russ Cox的很棒的RE2 library的Python library bindings。它还支持本机Unicode,包括简单的基于字符的casefolding,与
re
不同的是,它显著地提供了Unicode常规类别和Unicode脚本字符属性,这两个属性是Unicode处理更简单类型最常需要的两个关键属性。尽管RE2漏掉了一些Unicode特性,比如ICU、Perl和Python中的
\N{...}
命名字符支持,它具有极其严重的计算优势,使得它成为了regex引擎的首选,无论何时,只要您担心通过web查询等中的regex进行基于饥饿的拒绝服务攻击。它通过禁止反向引用来管理这一点,这会导致正则表达式不再是规则的,并有可能在时间和空间上发生超指数爆炸。Re2的库绑定不仅适用于C/C++和Python,而且还适用于Perl,尤其是GO,在那里很快就会替换标准的正则表达式库。
相关问题 更多 >
编程相关推荐