正则表达式 - 替换非unicode字符,但仅限于某些模式

问题描述 投票:0回答:1

我正在使用Django,试图为一大堆链接自动生成模板,其中一些链接具有非unicode字符(例如éç等)。虽然将这些字符放在文件名中似乎可以在我在自己的计算机上浏览时起作用,但django不喜欢它并且拒绝渲染它们。我想快速解决这个问题的方法就是用正则表达式替换这些字符,但只能在Django会遇到问题的网址中。

我试图解析的字符串 - 自动生成的模板 - 看起来像这样:

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上单独找到了这个问题的两个部分,使用不同的语言,但不是同时发现 - 但是我在组合这些答案时遇到了麻烦。)

python regex django
1个回答
1
投票

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

捕捉群体'不能'重复。如果是,您将在捕获组中最后一次出现。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.