python中的Re.sub无法正常工作

时间:2013-06-16 17:20:37

标签: python regex

假设:

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

2 个答案:

答案 0 :(得分:4)

re.I处于错误的位置(它被解释为count参数)。

来自documentation

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>'