我有一个路由器模块,它将主题与正则表达式进行比较,并将出现的事件与重合的键掩码链接起来。(它是一个简单的 url 路由过滤,如 symfony http://symfony.com/doc/current/book/routing.html)
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'} Blockquote
find_matches('hello/{city}/{phone}/world', 'hello/mycity/12345678/world', regexes={'phone': '\d+'})
输出:
{'city': 'mycity', 'phone': '12345678'} Blockquote
find_matches('hello/{city}/{phone}/world', 'hello/something/mycity/12345678/world', regexes={'phone': '\d+'})
输出:
{'city': 'something/mycity', 'phone': '12345678'}
这是不匹配的(应该返回 None 而不是 'city': 'something/mycity')。我该如何解决这个问题?我怎样才能匹配第一个“/”出现或其他方式?
谢谢!