如何检查一个字符串是否与多个模式匹配?
我想检查一个网址是否符合我定义的模式列表。
我的模式列表是:
pat = ['/FoodListAdminCP/Login[/]?', '/FoodListAdminCP[/]?']
我用这段代码来检查这个网址是否和列表中的某个项目匹配。
import re
f = re.compile('|'.join(pat))
if f.match(self.request.uri):
self.login = True
else:
self.login = False
现在,如果我请求的URL是/FoodListAdminCP/Dashboard
,这个网址就和模式匹配了。因为这个网址的开头部分和我列表中的'/FoodListAdminCP[/]?'
相符。
但我希望我的请求网址能够和列表中的整个项目匹配,而不是只匹配一部分。
我该怎么做呢?
3 个回答
1
在你的正则表达式(regex)末尾加上\Z。
f = re.compile('(' + '|'.join(pat) + ')\Z')
3
如果你不想把多个模式拼接在一起,因为这样可能不够灵活,而是想分别匹配它们,你可以使用 [re.compile(p).match(uri) for p in pat]
这种叫做列表推导式的方法,来获取所有模式的匹配结果列表:
>>> 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])
5
如果你想要让整个网址都符合你的模式,可以用'^'和'$'来分别表示字符串的开始和结束。
在你的例子中,你可以使用
f = re.compile('|'.join( '(^'+p+'$)' for p in pat ))
来获取正则表达式
'(^/FoodListAdminCP/Login[/]?$)|(^/FoodListAdminCP[/]?$)'
从你的 pat
列表中。