我想检查定义模式列表中的URL。 我的模式列表是:
pat = ['/FoodListAdminCP/Login[/]?', '/FoodListAdminCP[/]?']
我使用此代码检查与此列表中的一项匹配的网址
import re
f = re.compile('|'.join(pat))
if f.match(self.request.uri):
self.login = True
else:
self.login = False
现在,如果我请求/FoodListAdminCP/Dashboard
作为URL,则匹配模式。因为此网址的开头与我列表中的'/FoodListAdminCP[/]?'
匹配。
我希望我的请求网址与整个列表项不匹配。
我怎么做?
答案 0 :(得分:4)
如果您希望将整个网址与您的模式相匹配,可以使用' ^'和' $'匹配要匹配的字符串的开头和结尾。
在您的示例中,您可以使用
f = re.compile('|'.join( '(^'+p+'$)' for p in pat ))
获取正则表达式
'(^/FoodListAdminCP/Login[/]?$)|(^/FoodListAdminCP[/]?$)'
来自pat
列表。
答案 1 :(得分:2)
如果您不想连接可能不够灵活但又单独匹配的模式,则可以使用[re.compile(p).match(uri) for p in pat]
list comprehrension获取所有模式的匹配结果列表:
>>> import re
>>> pat = ['/FoodListAdminCP/Login[/]?', '/FoodListAdminCP[/]?']
>>> uri = '/FoodListAdminCP/Dashboard'
>>> match_results = [re.compile(p).match(uri) for p in pat]
>>> match_results
[None, <_sre.SRE_Match object at 0x101c05d30>]
然后,您可以使用all
询问所有结果是否匹配,这是您希望login
成为的:
>>> login = all(match_results)
>>> login
False
或简而言之:
login = all([re.compile(p).match(uri) for p in pat])
答案 2 :(得分:1)
\ Z。
f = re.compile('(' + '|'.join(pat) + ')\Z')