我正在与Django合作,尝试为大量链接自动生成模板,其中有些链接具有非Unicode字符(例如é
,ç
等)。当我在自己的计算机上浏览时,将这些字符放入文件名中似乎可以工作,但是django不喜欢它,并且拒绝渲染它们。我想到了一个快速的解决方案,就是用下划线或其他内容来正则表达式替换这些字符,但只能在Django否则会出现问题的URL中使用。
我要解析的字符串-自动生成的模板-看起来像这样:
desc = """...blah blah blah <a href="{% url 'myproject:do_thing' arg_name='ñôt-unìcodé' %}">Link Text Ñôt Unìcodé</a> blah blah blah ..."""
因此,我想使用正则表达式将ñôt-unìcodé
更改为__t-un_cod_
,同时保持Ñôt Unìcodé
不变。这是我尝试过的:
re.findall(r"'arg_name='(([^'])+?)'", desc)
我打算给我一个所有字符的可解析列表,然后可以分别通过re.sub
替换它们:
['ñ', 'ô', 't', '-', 'u', 'n', 'ì', 'c', 'o', 'd', 'é', ...]
但是相反,我最终得到了整个字符串和最后一个字母:
[('ñôt-unìcodé', 'é'), ...]
我在这里误会什么?
(我已经在stackoverflow上以不同的语言分别找到了这个问题的两个部分,但不是同时出现-我在合并这些答案时遇到了麻烦。)
答案 0 :(得分:1)
您正在将+
添加到捕获组:([^'])+
“无法”重复捕获组。如果是这样,您将只在捕获组中获得最后一个匹配项。
所以在[('ñôt-unìcodé', 'é'), ...]
,第一个是整个比赛。最后一个是捕获组(最后一个字母)。
尝试改用arg_name='([^']+)'
甚至arg_name='[^']+'