1

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

但我再次需要他们的帮助。

我有一个像

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+)/$',

O 如何用 dict 中的匹配值替换字符串中的(?P< group_id >\d+), (?P< account_id >\d+), ?(?P< other_id >\d+)

4

3 回答 3

2

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

但是,Python 正则表达式不能以尊重嵌套结构的方式匹配包含任意深度嵌套括号的字符串。(可以使用 Perl 的递归正则表达式。)

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

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/$

如果您确实需要解析嵌套括号,那么您将需要一个不同于re. 例如,Pyparsing可以处理嵌套表达式。

于 2012-12-01T10:38:58.203 回答
1

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

for key in d:
    s = s.replace(key,str(d[key]))
s = s.replace('(?P<','').replace('>\d+)','')
于 2012-12-01T10:26:32.570 回答
0

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

首先,为了让您的生活更轻松并命名您的 url 模式

urlpatterns = patterns('',
    (r'^settings/usergroups/(?P<group_id>\d+)/cargroups/$', 'car_groups_by_id'),
    # and so on
)

然后在你的views.py,如果你想重定向一个用户:

from django.shortcuts import redirect

def foo(request):
    return redirect('car_groups_by_id',group_id=1234)

如果要在模板中生成 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 方法是使用内置的模板字符串

>>> from string import Template
>>> t = Template('foo/bar/$group_id/zoo/')
>>> t.substitute(group_id=1234)
'foo/bar/1234/zoo/'

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

于 2012-12-01T10:12:50.237 回答