模式匹配列表a与列表b

时间:2013-06-24 20:21:12

标签: python pattern-matching

我对Python很新。

我有两个列表

列出A [a,b,c]
列表B [c,d,e,f,g,h]

我想re.match(或re.search)列出列表B中的变量。如果列表A中的任何变量不在列表B中,它应该返回false。

在上面的列表中,它应该返回false。

我可以尝试循环如下吗?

表示listA中的x:
 如果re.match(listB,x)
 返回错误

3 个答案:

答案 0 :(得分:3)

您可以使用all

>>> lis1 =  ['a', 'b', 'c'] 
>>> lis2 =  ['c','d','e','f','g','h']
>>> all(x in lis2 for x in lis1)
False

如果lis2是巨大的,请先将其转换为set,因为集合提供O(1)查询:

>>> se = set(lis2)
>>> all(x in se for x in lis1)
False

正则表达式不适用于列表。

答案 1 :(得分:2)

这听起来像集合的工作,而不是正则表达式:

 set(listA) & set(listB) == set(listA)

以上说明:如果两组的交集具有与第一组相同的元素,则第一组的所有元素也存在于第二组中。或者,正如Jon指出的那样,基于设定差异的解决方案也是可能的:

 not set(listA) - set(listB)

以上陈述:如果第一组中没有第二组中没有的元素,那么条件成立(抱歉双重否定!)

答案 2 :(得分:0)

只需遍历列表,然后使用all

>>> llist = "a b c".split()
>>> rlist = "c d e".split()
>>> all(re.match(left, right) for left in llist for right in rlist)
False

如果llist包含“true”regexps:

,这只会变为interessant
>>> llist = [r"^.+foo$", r"^bar.*$"]
>>> rlist = ["foozzz", "foobar"]
>>> all(re.match(left, right) for left in llist for right in rlist)
False