如果列表中存在多个模式,则使用正则表达式检查

2024-06-28 19:31:15 发布

您现在位置:Python中文网/ 问答频道 /正文

l = ['abc_123','abc_456','ade_098','def_765','deg_432']

patterns=['a.*3','def.*']

我试图找到一个正则表达式,它可以同时检查patterns中的两种模式是否都存在于列表l中。 在上面的示例中,这是正确的,因为“abc_123”和“def_765”匹配patterns中的每个模式。我想到

[s for s in l if ((re.match(patterns[0], s)) or (re.match(patterns[1], s)))]

但是如果我有一个如下的列表,我该怎么办

l = ['abc_123','abc_456','ade_093','deh_765','deg_432']

在本例中,上面的代码将给出两个结果,但仅匹配模式“a.*3

理想情况下,如果两种模式都匹配,我希望返回True,否则返回False

我可以做类似的事情

pat0 = [s for s in l if re.match(patterns[0], s)]
pat1 = [s for s in l if re.match(patterns[1], s)]

并检查pat0pat1是否都不是空的,但这似乎有点浪费,特别是如果我的列表很长并且有几种模式的话


Tags: inre示例列表forifdefmatch
2条回答

您可以尝试:

>>> patterns=['a.*3','def.*']
>>> 
>>> l1 = ['abc_123','abc_456','ade_098','def_765','deg_432']
>>> all((any(re.match(p,s) for s in l1) for p in patterns))
True # b/c 'a.*3' matches 'abc_123' AND 'def.*' matches def_765
>>>
>>> l2 = ['abc_123','abc_456','ade_093','deh_765','deg_432']
>>> all((any(re.match(p,s) for s in l2) for p in patterns))
False # b/c 'a.*3' matches 'abc_123' BUT there is not match for 'def.*' 

这是非常基本的布尔逻辑。您正在使用or。如果其中一个为true,则返回true。您需要and,它仅在两个条件都为true或者在您的案例中两个条件都匹配时才返回true

您的最终代码是[s for s in l if ((re.match(patterns[0], s)) and (re.match(patterns[1], s))]

相关问题 更多 >