2011-02-01 112 views
2

我希望能夠使用正則表達式替換文件中的字符串。但是我的功能找不到匹配。所以我嘲笑了一個測試來複制正在發生的事情。爲什麼這個正則表達式不匹配這個字符串?

我定義我想更換如下字符串:

string = 'buf = O_strdup("ONE=001&TYPE=PUZZLE&PREFIX=EXPRESS&");'

我想替換 「TYPE = PUZZLE & PREFIX = EXPRESS &」 部分用別的東西。 NB。該字符串在原始文件中並不總是完全包含「PUZZLE」和「PREFIX」,但它將具有該格式)。

所以首先我試着測試我是否得到了正確的匹配。

obj = re.search(r'TYPE=([\^&]*)\&PREFIX=([\^&]*)\&', string) 
if obj: 
    print obj.group() 
else: 
    print "No match!!" 

認爲([\^&]*)將匹配任何數量的不是一個符號字符。 但我總是得到「不匹配!!」。

然而, obj = re.search(r'TYPE=([\^&]*)', string)

返回我 「TYPE =」

爲什麼我的第一個工作?

+0

爲什麼在^之前的反斜槓? – abesto 2011-02-01 09:58:33

+1

第一次改變應該是[^&] – 2011-02-01 09:58:56

回答

5

由於^符號逃脫\以下部分:([\^&]*)匹配這些的任何字符序列:^,&。

嘗試用([^&]*)代替它。

1

在我的正則表達式測試儀,這樣沒有問題:'TYPE=(.*)\&PREFIX=(.*)\&'

0

試試這個

obj = re.search(r'TYPE=(?P<type>[^&]*?)&PREFIX=(?P<prefix>[^&]*?)&', string) 

?P<some_name>是一個名爲捕獲組,並一點點輕鬆地訪問捕獲的組,obj.group("type") -->> 'PUZZLE'

0

使用函數urlparse.parse_qsl()urllib.urlencode()而不是正則表達式可能會更好。代碼將不太容易出錯:

from urlparse import parse_qsl 
from urllib import urlencode 
s = "ONE=001&TYPE=PUZZLE&PREFIX=EXPRESS&" 
a = parse_qsl(s) 
d = dict(TYPE="a", PREFIX="b") 
print urlencode(list((key, d.get(key, val)) for key, val in a)) 
# ONE=001&TYPE=a&PREFIX=b