2014-01-09 49 views
2

將一些Perl代碼轉換爲python,並且我有一個在Perl中完美工作的正則表達式,但是當我將它複製到re.match時不起作用。 Perl的線是:將Perl正則表達式轉換爲python

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

和我的翻譯巨蟒:

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

,你可以看到我複製粘貼正則表達式爲re,排除包封/。但是,對於此行Perl的正則表達式匹配,但蟒蛇一個dosent:

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

是正則表達式的語法應該是完全一樣的? 任何人都可以幫助我嗎? 謝謝

+0

發現問題 - 我使用're.match'來搜索字​​符串的開頭,而Perl默認使用're.search'來搜索整個字符串。如果有人發現這種情況有用,我會留下來。 – WeaselFox

+0

發佈它作爲答案,並自我接受:) – aIKid

+0

然後發佈它作爲答案。作爲一個側面說明,我不明白你爲什麼有時使用文字空間或'\ s' ... – HamZa

回答

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之初,看看是否有效。當我將測試字符串複製到我的編輯器時,我意外地用兩個前導空格而不是一個來複制它,當然這種模式不匹配,因爲它只檢查一個。

+0

啊,它一定是由於在空白處開始比..謝謝 – WeaselFox

1

發現問題 - 我用re.match在字符串的開頭搜索,而Perl默認爲re.search,它搜索整個字符串。如果有人發現這種情況有用,我會留下來。

相關問題