正则表达式-替换非Unicode字符,但只能以某些模式

时间:2018-08-14 14:50:42

标签: python regex django

我正在与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上以不同的语言分别找到了这个问题的两个部分,但不是同时出现-我在合并这些答案时遇到了麻烦。)

1 个答案:

答案 0 :(得分:1)

您正在将+添加到捕获组:([^'])+

“无法”重复捕获组。如果是这样,您将只在捕获组中获得最后一个匹配项。

所以在[('ñôt-unìcodé', 'é'), ...],第一个是整个比赛。最后一个是捕获组(最后一个字母)。

尝试改用arg_name='([^']+)'甚至arg_name='[^']+'