如果字符串等于列表a中的项目,则后跟列表b中的项目

时间:2012-09-22 18:32:14

标签: python

我想创建一个if语句来检测是否可以按列表中的项目形成字符串。例如,如果我想检查一个术语是否与“HelloWorld”具有相同的含义,我将有一个带有['hello', 'Hello', 'Hi', 'Greetings', 'Hola']的“hello”列表和一个带有['world', 'World', 'Planet', 'Earth']的“world”列表。然后,检查字符串是否等于“hello”列表中的任何项目,然后直接跟随“world”列表中的任何项目。 “HelloWorld”,“GreetingsEarth”和“HiPlanet”都将成功触发if语句。我该怎么做?我想使用Python列表,因此正则表达式(a | b)似乎不切实际。

4 个答案:

答案 0 :(得分:4)

如果要避免使用正则表达式,可以使用测试每个组合的生成器表达式(通过itertools.product生成):

import itertools
combinations = (''.join((first, second)) for first, second in itertools.product(a, b))
any('HelloWorld' == combination for combination in combinations)

请注意,比正则表达式方法慢,尤其是遇到最坏情况时(不匹配):

>>> timeit.timeit('search("HelloWorld"); search("HiThere")', 'from __main__ import reMatch as search')
1.8922290802001953
>>> timeit.timeit('search("HelloWorld"); search("HiThere")', 'from __main__ import genMatch as search')
18.3697190284729

生成器表达式比正则表达式方法慢10倍。

(我使用re.compile()编译的正则表达式进行测试。

答案 1 :(得分:2)

正则表达式可以正常工作:

a = ['hello', 'Hello', 'Hi', 'Greetings', 'Hola']
b = ['world', 'World', 'Planet', 'Earth']

import re
r = '^(%s)(%s)$' % ('|'.join(a), '|'.join(b))

print re.match(r, "HelloWorld").groups() # ('Hello', 'World')
print re.match(r, "HiThere") # None

非正则表达式解决方案很繁琐:

s = "GreetingsEarth"
for x in a:
    if s.startswith(x) and s[len(x):] in b:
        print x, '+', s[len(x):]
        break 

答案 2 :(得分:2)

这实际上可以使用正则表达式完成,如下所示:

list1 = ['hello', 'Hello', 'Hi', 'Greetings', 'Hola']
list2 = ['world', 'World', 'Planet', 'Earth']
regex = "(%s)(%s)" % ("|".join(list1), "|".join(list2))
print re.match(regex, "HelloWorld")

但也可以使用itertools.product

完成
print any("HelloWorld" == x + y for x, y in itertools.product(list1, list2)) 

答案 3 :(得分:1)

我在第二个列表中使用了一个集合,因此您不必每次都对它的所有项进行迭代。

a = ['hello', 'Hello', 'Hi', 'Greetings', 'Hola']
b = ['world', 'World', 'Planet', 'Earth']

b_set = set(b)
needle = 'HelloWorld'
for start in a:
    if needle.startswith(start) and needle[len(start):] in b_set:
         print 'match'

如果您正在寻找更短的版本

any((needle[len(start):] in b_set for start in a if needle.startswith(start)))

itertools.product相比,此解决方案不必比较所有n^2种可能的组合,但只需要在第一个列表(n)上走一次,最坏的情况是一个额外的集查找。