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

(?P< group_id >\d+)文字列内の, (?P< account_id >\d+),(?P< other_id >\d+)を dict の一致する値に置き換えるにはどうすればよいですか?

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 に答える