奇怪的python re.sub行为

时间:2018-04-16 12:32:16

标签: python regex hyperlink

最近,我尝试了一些代码,如果输入了某种语法,它应该创建一个html链接。但是,由此产生的行为远非预期的行为:

输入:

string = u"[id: 196]"

代码

reg = re.compile("(\[id:\s*(\d+)\])")
matches = re.findall(reg, string)
for match in matches:
    entry = object_pool.find(int(match[1])) // Just returns an object (already tested)
    string = re.sub(match[0], "<a href='/search#?id=%s?'>%s</a>" % (entry.id, entry.name), string)

我期待以下输出:

<a href='/search#?id=196'>Production line n°4</a>

然而,实际产量为[生产线n°4生产线n°4生产线n°4生产线n°4生产线n°4生产线n°4]

[<a href='/search#?id=196'>Production line n°4</a><a href='/search#?id=196'>Production line n°4</a><a href='/search#?id=196'>Production line n°4</a><a href='/search#?id=196'>Production line n°4</a><a href='/search#?id=196'>Production line n°4</a><a href='/search#?id=196'>Production line n°4</a>]

有什么我不懂的吗?我是否意外地违反了编程规则并让蟒蛇在死亡循环中吃掉了自己的尾巴?我应该得到死刑吗?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

据我了解,您无需使用re.sub,因为match[0]中没有替换。

试试这个:

reg = re.compile("(\[id:\s*(\d+)\])")
matches = re.findall(reg, string)
for match in matches:
    entry = object_pool.find(int(match[1]))
    url = "<a href='/search#?id=%s?'>%s</a>" % (entry.id, entry.name)

答案 1 :(得分:0)

这里的问题是re.sub()期望第一个参数作为正则表达式,其中match[0]是&#39; [id:196]&#39;,这意味着*替换任何一个你的字符串的字符:i,d,:,space,......知道这一点,你有几个选择。由于我不了解足够的背景,我不能做出更好的决定,你必须决定:

使用原始&#39; reg`作为第一个参数

string = re.sub(reg, "<a href='/search#?id=%s?'>%s</a>" % (entry.id, entry.name), string)

转义match[0]参数

string = re.sub(re.escape(match[0]), "<a href='/search#?id=%s?'>%s</a>" % (entry.id, entry.name), string)

直接替换字符串

anchor = string.replace(match[0], "<a href='/search#?id=%s?'>%s</a>" % (entry.id, entry.name))