Python正则表达式替换

Python正则表达式替换,python,regex,Python,Regex,我一直很难理解正则表达式。在网络搜索的帮助下,我总能设法渡过难关。我想我从来没有费心去真正学习过。对不起 但我还需要他们的帮助 我有一个口授考试 d = {'account_id':a_value,'group_id':g_value,'other_id':o_value } 我有很多字符串,比如: s1 = r'^settings/usergroups/(?P<group_id>\d+)/cargroups/$' s2 = r'^settings/usergroups/(?P&l

我一直很难理解正则表达式。在网络搜索的帮助下,我总能设法渡过难关。我想我从来没有费心去真正学习过。对不起

但我还需要他们的帮助

我有一个口授考试

d = {'account_id':a_value,'group_id':g_value,'other_id':o_value }
我有很多字符串,比如:

s1 = r'^settings/usergroups/(?P<group_id>\d+)/cargroups/$'
s2 = r'^settings/usergroups/(?P<group_id>\d+)/other/(?P<other_id>\d+)/$',
s3 = r'^settings/account/(?P<account_id>\d+)/other/(?P<other_id>\d+)/$',
s1=r'^settings/usergroups/(?P\d+)/cargroups/$'
s2=r“^settings/usergroups/(?P\d+)/other/(?P\d+)/$”,
s3=r“^settings/account/(?P\d+)/other/(?P\d+)/$”,

如何用dict中的匹配值替换字符串中的
(?p\d+)
(?p\d+)
(?p\d+)

这个问题与正则表达式无关;但更多的是为特定视图生成URL

首先,让你的生活变得轻松:

如果要在模板中生成url:

{% url 'car_groups_by_id' group_id=1234 %}
如果您只想打印URL:

>>> from django.core.urlresolvers import reverse
>>> reverse('car_groups_by_id',kwargs={'group_id': 1234})

通用的非django方法是使用内置的:


在这两种情况下,这都不是正则表达式问题,因为您没有尝试匹配某些内容—只需替换字符串中的标记即可。碰巧您的示例字符串的标记是python正则表达式。

如果您想进行简单的字符串修改并用
d
中关联的值替换字符串,您可以执行以下操作:

for key in d:
    s = s.replace(key,str(d[key]))
s = s.replace('(?P<','').replace('>\d+)','')
对于d键:
s=s.replace(键,str(d[key]))
s=s.替换(“(?P\d+”,”)

正则表达式可以包含嵌套的括号

但是,以尊重嵌套结构的方式。(可以使用Perl的递归正则表达式。)

因此,如果您的用例包含不包含嵌套Parethes的字符串, 然后,以下内容就足够了,但请注意下面最后一个结果中不需要的额外括号:

import re
d = {'account_id':'a_value','group_id':'g_value','other_id':'o_value' }

tests = (r'^settings/usergroups/(?P<group_id>\d+)/cargroups/$',
         r'^settings/usergroups/(?P<group_id>\d+)/other/(?P<other_id>\d+)/$',
         r'^settings/account/(?P<account_id>\d+)/other/(?P<other_id>\d+)/$',
         r'^settings/usergroups/(?P<group_id>(\d+|\w))/other/(?P<other_id>\d+)/$'
         )
metapat = r'\(\?P<(.*?)>.*?\)'
for t in tests:
      result = re.sub(metapat, r'{\1}', t)
      if result:
            print(result.format(**d))

如果确实需要解析嵌套括号,则需要与
re
不同的解析器,例如,可以处理嵌套表达式。

看起来可能与Django相关。如果是,你考虑过吗?是的,我从我的django项目中获取了URL。问题本身与django没有太大关系,因为django URL通过验证字符串“settings/usergroups/12/cargroups/是否与给定模式之一匹配来自行解决所有这些问题。我不需要匹配模式的URL。我需要从模式和值创建字符串。因此,尽管我的示例取自django,但问题本身与python相关,而与django无关。这个问题与regexp也没有太大关系。我假设我的问题可以用regexp解决-这就是我将问题标记为regexp的原因。我之所以这样认为是因为我曾经看到过一些示例,其中python datetime是使用regexp从dict构造的。不过我可能记错了。在任何情况下,用数字替换字符串中的“account_id”之类的东西都非常简单。但是can(?P+)这绝对不是我要求的。谢谢你尝试。就像我在评论中说的。这与django无关。我正在寻找用数字替换字符串中的(?P\d+)的方法。但是感谢你指出django url templatetag在内部就是这么做的。我会调查一下。你在评论中说的“我不需要为模式匹配URL。我需要从模式和值创建字符串。",而且因为您使用了django URL-这就是我提到的原因。但是,我已经用非django的方式更新了答案。太棒了!谢谢。字符串和模板后的注释示例非常有用。标记确实是python正则表达式,我确信有一种方法可以用值替换整个表达式部分。毕竟,您可以创建正则表达式来创建/验证正则表达式,对吗?现在看来djangos reverse在内部所做的就是我在本例中需要的东西:)是的,这将是一种方法。不过,这有点绕着重点。每个值的模式可能不同。当然,在这种情况下,它们是相同的,但它们可能不同。用于替换模式的值也可以/应该与模式匹配。那么模式中是否存在一些规律性?嗯,是的。谢谢你的回答:)。最终,您的解决方案所做的或多或少与dedoco的答案相同。不过,它的方式有点花哨:)。我仍在试图理解django是如何做同样的事情的——它可以接受模式,验证值是否与模式匹配,然后从中生成包含值的url(基本上是字符串)。我想你最了解我试图实现的目标,并以最好的方式解释了我可以或不能使用正则表达式做什么。这就是我接受这个的原因。
>>> from string import Template
>>> t = Template('foo/bar/$group_id/zoo/')
>>> t.substitute(group_id=1234)
'foo/bar/1234/zoo/'
for key in d:
    s = s.replace(key,str(d[key]))
s = s.replace('(?P<','').replace('>\d+)','')
import re
d = {'account_id':'a_value','group_id':'g_value','other_id':'o_value' }

tests = (r'^settings/usergroups/(?P<group_id>\d+)/cargroups/$',
         r'^settings/usergroups/(?P<group_id>\d+)/other/(?P<other_id>\d+)/$',
         r'^settings/account/(?P<account_id>\d+)/other/(?P<other_id>\d+)/$',
         r'^settings/usergroups/(?P<group_id>(\d+|\w))/other/(?P<other_id>\d+)/$'
         )
metapat = r'\(\?P<(.*?)>.*?\)'
for t in tests:
      result = re.sub(metapat, r'{\1}', t)
      if result:
            print(result.format(**d))
^settings/usergroups/g_value/cargroups/$
^settings/usergroups/g_value/other/o_value/$
^settings/account/a_value/other/o_value/$
^settings/usergroups/g_value)/other/o_value/$