将Perl正则表达式转换为python

时间:2014-01-09 12:12:19

标签: python regex perl

我将一些Perl代码转换为python,并且我有一个在Perl中完美运行的正则表达式,但在将其复制到re.match时不起作用。 Perl系列是:

if !(/(\s\{\s0x[0-9A-Fa-f]*, 0x[0-9A-Fa-f]*, .*\}.*)|(.* reservations for core .*)|(.* reservedMemoryAreas.*)/)

我对python的翻译是:

if re.match('(\s\{\s0x[0-9A-Fa-f]*, 0x[0-9A-Fa-f]*, .*\}.*)|(.* reservations for core .*)|(.* reservedMemoryAreas.*)',line)is None:

正如您所看到的,我将正则表达式复制粘贴到re,不包括封闭的/。然而对于这一行,Perl正则表达式匹配,但是python是一个剂量:

  { 0x0000000097747E80, 0x40, 1, 0x0, 1, 0x0, 1, 0x0, 0, 0x0, 1, 0, "Res[0]" }, // Res[0]

正则表达式语法应该完全相同吗? 有人可以帮我从这里出去吗? 感谢

2 个答案:

答案 0 :(得分:3)

我使用你的模式在Python中得到一个匹配。

import re

string = ' { 0x0000000097747E80, 0x40, 1, 0x0, 1, 0x0, 1, 0x0, 0, 0x0, 1, 0, "Res[0]" }, // Res[0]'
pattern = '(\s\{\s0x[0-9A-Fa-f]*, 0x[0-9A-Fa-f]*, .*\}.*)|(.* reservations for core .*)|(.* reservedMemoryAreas.*)'

if re.match(pattern, string):
    print "Found match."
else:
    print "No match."

>>> python test.py
>>> Found match.

另一件事:你不需要使用if ... is None:,你可以使用

if regex(pattern, string):

Python使用了隐含的布尔值。因此,在布尔上下文中,None求值为False

您可以尝试在开头使用\s+而不仅仅是\s,看看是否有效。当我将测试字符串复制到我的编辑器时,我意外地用两个前导空格而不是一个空格复制它,当然模式不匹配,因为它只检查一个。

答案 1 :(得分:1)

发现问题 - 我使用re.match在字符串的开头搜索,而Perl默认为re.search搜索整个字符串。我会留下这个,万一有人发现这个有用。