假设:
s = '<A HREF="http://www.google.com" ID="test">blah</A>'
我想在网址前添加“url:”,所以我尝试了:
s = re.sub(r'href="([\w:/.]+)"', "url: " + r'\1', s, re.I)
但这不会改变s
。
答案 0 :(得分:4)
re.I
处于错误的位置(它被解释为count
参数)。
re.sub(pattern, repl, string, count=0, flags=0)
^^^^^ ^^^^^
尝试:
In [27]: re.sub(r'href="([\w:/.]+)"', "url: " + r'\1', s, flags=re.I)
Out[27]: '<A url: http://www.google.com ID="test">blah</A>'
答案 1 :(得分:2)
虽然另一个答案在技术上绝对正确,但我认为你不希望那里提到的那些。
相反,您可能希望使用匹配对象:
m = re.search(r'href="([\w:/.]+)"', s, re.I)
print m.expand(r"url: \1")
导致
url: http://google.com
之前没有<A
而后面是ID="test">blah</A>
。
(如果您想要进行更多这些替换,您甚至可能希望通过编译来重用正则表达式:
r = re.compile(r'href="([\w:/.]+)"', re.I)
ex = lambda st: r.search(st).expand(r"url: \1")
print ex('<A HREF="http://www.google.com" ID="test">blah</A>')
print ex('<A HREF="http://www.yahoo.com" ID="test">blah</A>')
# and so on.
但是,如果您确实希望保留HTML,那么您将不得不使用前瞻和后瞻性表达式:
re.sub(r'(?<=href=")([\w:/.]+)(?=")', "url: " + r'\1', s, flags=re.I)
# -> '<A HREF="url: http://www.google.com" ID="test">blah</A>'
或简单地重复省略的东西:
re.sub(r'href="([\w:/.]+)"', r'href="url: \1"', s, flags=re.I)
# -> '<A href="url: http://www.google.com" ID="test">blah</A>'