Python: 查找URL并添加查询字符串对

1 投票
3 回答
582 浏览
提问于 2025-04-16 07:49

我正在尝试在一个Django的网页应用中给一些旧文本添加关联标识。这其实很简单。文本中有一些亚马逊的链接,我想在这些链接的末尾加上我的?tag=xxx标识。

我写了一个模板过滤器,可以快速处理我的文本,但在写正则表达式的逻辑上有点卡住了。

t = text_from_template_engine
return re.sub(r'(https?://(?:www\.)?amazon\.co\.uk[\S]+)', r'\\\1?tag=xxx', t)

这个方法在基本情况下是有效的,但如果链接已经有查询字符串(很多亚马逊的链接默认就有),我就需要用一个&符号,而不是问号。

我想可能有个简单的方法可以检测到两个问号,并替换第二个。我对此持开放态度。

我真正想要的是一种正则替换的方法,可以把找到的字符串传递给另一个方法(在这个方法里我可以检测现有的问号),然后这个方法应该返回替换后的字符串。就像PHP中的preg_replace_callback那样。有没有类似的东西呢?

3 个回答

0

一旦你找到了网址,最好是好好解析一下它,而不是用正则表达式去拼凑它。

0

可能有个简单的方法可以找到两个问号,并替换掉第二个。我很乐意听听这个建议。

这个方法可以找到两个问号。

(\?|(\?\?))

我认为对于这两个问号,非被动组的编号应该是 $4,但你需要再确认一下,然后在替换的时候可以把单个问号加回来。

2

是的,re.sub的第二个参数可以是一个函数,这个函数会接收一个match对象,并返回一个字符串。你可以查看文档了解更多信息。

撰写回答