Python中与Perl兼容的正则表达式(PCRE)
我必须在Python中解析一些基于PCRE的字符串,我不知道该怎么做 我要分析的字符串如下所示:Python中与Perl兼容的正则表达式(PCRE),python,regex,parsing,pcre,Python,Regex,Parsing,Pcre,我必须在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操作相关的东西是这个模块:(但它是用.so文件编写的…) 您知道是否存在用于分析此
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操作相关的东西是这个模块:(但它是用.so文件编写的…)
您知道是否存在用于分析此类字符串的Python模块吗?您正在查找”(\w/[^/]+/\w*)”
像这样使用,
import re
x = re.compile('(\w/[^/]+/\w*)')
s = 'match mysql m/^.\0\0\0\n(4\.[-.\w]+)\0...\0/s p/MySQL/ i/$1/'
y = x.findall(s)
# y = ['m/^.\x00\x00\x00\n(4\\.[-.\\w]+)\x00...\x00/s', 'p/MySQL/', 'i/$1/']
在玩Edi Weitz的游戏时发现了它,所以感谢对这个问题的评论,这让我想起了它的存在。在Python中使用非ASCII时要特别小心
Python如何处理或未能处理模式和字符串中的非ASCII存在一些非常微妙的问题。更糟糕的是,这些差异很大程度上取决于您使用的Python版本,还取决于您是否拥有“广泛构建” 一般来说,当您使用Unicode时,具有宽构建的Python3工作得最好,而具有窄构建的Python2工作得最差,但是所有的组合与Perl正则表达式相对于Unicode的工作方式仍然相差甚远。如果你在找ᴘᴄʀᴇ 在Python模式中,您可能需要比它的旧
re
模块看得更远一些
烦人的“广泛构建”问题终于得到了彻底解决,前提是您使用了足够高级的Python版本。以下是一段摘录:
功能
由引入的更改如下:
- Python现在始终支持各种Unicode代码点,包括非BMP代码点(即从U+0000到U+10FFFF)。窄版本和宽版本之间的区别不再存在,Python现在的行为就像宽版本一样,即使在Windows下也是如此
- 随着狭义构建的消亡,狭义构建特有的问题也得到了解决,例如:
现在对于非BMP字符总是返回1,因此len()
李>len('\U0010FFFF')==1
- 代理项对不会在字符串文本中重新组合,因此
李>'\uDBFF\uDFFF'!='\U0010FFFF'
- 索引或切片非BMP字符将返回预期值,因此
现在返回'\U0010FFFF'[0]
,而不是'\U0010FFFF'
李>'\uDBFF'
- 标准库中的所有其他函数现在都可以正确处理非BMP代码点
的值现在总是1114111(十六进制的0x10FFFF)。sys.maxunicode
函数仍然返回0xFFFF或0x10FFFF以实现向后兼容性,并且不应与新的Unicode API一起使用(请参阅)PyUnicode_GetMax()
标志已删除带有宽unicode的./configure
re
库中当前可用的相比,它在几乎所有可能的方面都要好得多,并且很可能最终取代re
。它与您的问题特别相关的是,他的regex
库要多得多ᴘᴄʀᴇ (也就是说,比现在的re
更加兼容Perl),这将使您更容易将Perl正则表达式移植到Python。因为它是一种从头开始的重写(就像从头开始,而不是像汉堡包:),所以它在编写时考虑到了非ASCII,而re
不是
因此,regex
库在如何处理问题方面更接近于(当前)的建议。它满足或超过了UTS#18级别1的要求在大多数方面(如果不是全部的话),您通常必须使用ICU正则表达式库或Perl本身,或者如果您特别有勇气,新的Java 7对其正则表达式进行更新,因为这也符合UTS#18的要求
除了满足那些一级要求(这些要求对于基本的Unicode支持是绝对必要的,但是Python当前的re
库不能满足这些要求)之外,awesomeregex
库还满足命名字符(\N{…})
)的二级要求,扩展的Grapheme集群(\X
),以及新的RL2.7,其完整属性来自
Matthew的regex
模块还进行Unicode大小写折叠,以便不区分大小写的匹配在Unicode上可靠地工作,而re
则不然。
以下内容不再正确,因为regex
现在支持完全的Unicode大小写折叠,如Perl和Ruby
一个非常微小的区别是,目前,Perl的不区分大小写模式使用完全面向字符串的casefold,而他的regex
模块仍然使用简单的面向单个字符的casefold,但这是他正在研究的问题。这实际上是一个非常困难的问题,除了Perl,只有Ruby尝试过
在完全大小写折叠下,这意味着(例如)“ß”
现在正确匹配“SS”
,“SS”
,“ſſ”
,,“s”
(等等),当选择不区分大小写的匹配时。(这在希腊语脚本中显然比拉丁语脚本更重要。)
有关跨JavaScript、PHP、Go、Ruby、Python、Java和Perl的Unicode支持的一般问题,请参阅标题为“Unicode支持决战:好的、坏的和(大部分)丑陋的”的幻灯片或文档源代码。如果不能使用Perl正则表达式或可能的ICU正则表达式库(唉,它没有命名捕获),那么Matthew的Pythonregex
可能是你最好的选择
Nᴏᴛᴀ Bᴇɴᴇ sᴠ.ᴘ. (=你的解放军,等我的解放军:)以下未经请求