如何检查与多个模式匹配的字符串?

时间:2014-07-13 09:49:05

标签: python regex python-2.7 tornado

我想检查定义模式列表中的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[/]?'匹配。

我希望我的请求网址与整个列表项不匹配。

我怎么做?

3 个答案:

答案 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')