Python正则表达式替换

时间:2012-12-01 09:35:59

标签: 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<group_id>\d+)/other/(?P<other_id>\d+)/$',
s3 = r'^settings/account/(?P<account_id>\d+)/other/(?P<other_id>\d+)/$',

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

3 个答案:

答案 0 :(得分:2)

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

但是,Python regular expressions can not match strings containing arbitrarily deep nested parentheses以一种尊重嵌套结构的方式。 (可以使用Perl的递归正则表达式。)

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

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可以处理嵌套表达式。

答案 1 :(得分:1)

如果您想使用简单字符串修改,只需按照d中关联的值替换字符串,即可执行以下操作:

for key in d:
    s = s.replace(key,str(d[key]))
s = s.replace('(?P<','').replace('>\d+)','')

答案 2 :(得分:0)

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

首先,为了让您的生活更轻松,name your url patterns

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 'car_groups_by_id' group_id=1234 %}

如果您只想打印网址:

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

这样做的通用非django方法是使用内置的template strings

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

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