サブジェクトを正規表現と比較し、出現を一致するキーマスクとリンクするルーターモジュールがあります。(symfony http://symfony.com/doc/current/book/routing.htmlのような単純な URL ルーティング フィルタリング)
import re
from functools import partial
def to_named_groups(match, regexes):
group_name = re.escape(match.group(0)[1:-1])
group_regex = regexes.get(group_name, '.*')
return '(?P<{}>{})'.format(group_name, group_regex)
def make_regex(key_mask, regexes):
regex = re.sub(r'\{[^}]+\}', partial(to_named_groups, regexes=regexes),
key_mask)
return re.compile(regex)
def find_matches(key_mask, text, regexes=None):
if regexes is None:
regexes = {}
try:
return make_regex(key_mask, regexes).search(text).groupdict()
except AttributeError:
return None
.
find_matches('foo/{one}/bar/{two}/hello/{world}', 'foo/test/bar/something/hello/xxx')
出力:
{'one': 'test', 'two': 'something', 'world': 'xxx'} ブロック引用
find_matches('hello/{city}/{phone}/world', 'hello/mycity/12345678/world', regexes={'phone': '\d+'})
出力:
{'city': 'mycity', 'phone': '12345678'} ブロック引用
find_matches('hello/{city}/{phone}/world', 'hello/something/mycity/12345678/world', regexes={'phone': '\d+'})
出力:
{'city': 'something/mycity', 'phone': '12345678'}
これは不一致です ('city': 'something/mycity' ではなく、None を返す必要があります)。どうすればこれを解決できますか? 最初の「/」オカレンスまたは別の方法でどのように一致させることができますか?
ありがとう!