如何检查一个字符串是否与多个模式匹配?

3 投票
3 回答
1224 浏览
提问于 2025-04-18 13:07

我想检查一个网址是否符合我定义的模式列表。

我的模式列表是:

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 列表中。

撰写回答