我将一些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]
正则表达式语法应该完全相同吗? 有人可以帮我从这里出去吗? 感谢
答案 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
搜索整个字符串。我会留下这个,万一有人发现这个有用。