Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中与Perl兼容的正则表达式(PCRE)_Python_Regex_Parsing_Pcre - Fatal编程技术网

Python中与Perl兼容的正则表达式(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文件编写的…) 您知道是否存在用于分析此

我必须在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文件编写的…)

您知道是否存在用于分析此类字符串的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下也是如此
  • 随着狭义构建的消亡,狭义构建特有的问题也得到了解决,例如:
    • len()
      现在对于非BMP字符总是返回1,因此
      len('\U0010FFFF')==1
    • 代理项对不会在字符串文本中重新组合,因此
      '\uDBFF\uDFFF'!='\U0010FFFF'
    • 索引或切片非BMP字符将返回预期值,因此
      '\U0010FFFF'[0]
      现在返回
      '\U0010FFFF'
      ,而不是
      '\uDBFF'
    • 标准库中的所有其他函数现在都可以正确处理非BMP代码点
  • sys.maxunicode
    的值现在总是1114111(十六进制的0x10FFFF)。
    PyUnicode_GetMax()
    函数仍然返回0xFFFF或0x10FFFF以实现向后兼容性,并且不应与新的Unicode API一起使用(请参阅)
  • 已删除带有宽unicode的./configure
    标志
Python正则表达式的未来 与标准Python发行版的
re
库中当前可用的相比,它在几乎所有可能的方面都要好得多,并且很可能最终取代
re
。它与您的问题特别相关的是,他的
regex
库要多得多ᴘᴄʀᴇ (也就是说,比现在的
re
更加兼容Perl),这将使您更容易将Perl正则表达式移植到Python。因为它是一种从头开始的重写(就像从头开始,而不是像汉堡包:),所以它在编写时考虑到了非ASCII,而
re
不是

因此,
regex
库在如何处理问题方面更接近于(当前)的建议。它满足或超过了UTS#18级别1的要求在大多数方面(如果不是全部的话),您通常必须使用ICU正则表达式库或Perl本身,或者如果您特别有勇气,新的Java 7对其正则表达式进行更新,因为这也符合UTS#18的要求

除了满足那些一级要求(这些要求对于基本的Unicode支持是绝对必要的,但是Python当前的
re
库不能满足这些要求)之外,awesome
regex
库还满足命名字符(
\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的Python
regex
可能是你最好的选择


Nᴏᴛᴀ Bᴇɴᴇ sᴠ.ᴘ. (=你的解放军,等我的解放军:)以下未经请求