为什么这个正则表达式在这个字符串中不匹配?

时间:2011-02-01 09:52:58

标签: python regex

我希望能够使用正则表达式替换文件中的字符串。但我的功能是找不到匹配。所以我嘲笑了一个测试来复制正在发生的事情。

我已经定义了要替换的字符串,如下所示:

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 =”

为什么我的第一个不起作用?

4 个答案:

答案 0 :(得分:5)

由于^符号已使用\转义,因此以下部分:([\^&]*)匹配这些字符的任何序列:^,&。

尝试将其替换为([^&]*)

答案 1 :(得分:1)

在我的正则表达式测试器中,这确实有效:'TYPE=(.*)\&PREFIX=(.*)\&'

答案 2 :(得分:0)

试试这个

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

?P<some_name>是一个命名的捕获组,可以更轻松地访问捕获的组obj.group("type") -->> 'PUZZLE'

答案 3 :(得分: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