我一直很难理解正则表达式。在网络搜索的帮助下,我总是设法通过某种方式。猜猜我从来没有费心去学习。抱歉。
但我还需要帮助他们。
我有像
这样的词典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+)
?
答案 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正则表达式。