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