我希望能够使用正则表达式替换文件中的字符串。但我的功能是找不到匹配。所以我嘲笑了一个测试来复制正在发生的事情。
我已经定义了要替换的字符串,如下所示:
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 :(得分: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