我有两个列表,如下所示:
c = ['John', 'query 989877 forcast', 'Tamm']
isl = ['My name is Anne Query 989877', 'John', 'Tamm Ju']
我想检查其中的每一项isl
中的每一项c
这样我就可以得到所有部分字符串匹配项。
我需要的输出如下所示:
out = ["john", "query 989877", "tamm"]
可以看出,我也得到了部分字符串匹配。
我已经尝试过以下方法:
out = []
for word in c:
for w in isl:
if word.lower() in w.lower():
out.append(word)
但这只给我输出
out = ["John", "Tamm"]
我也尝试过以下方法:
print [word for word in c if word.lower() in (e.lower() for e in isl)]
但这只输出“John”。
我怎样才能得到我想要的东西?
也许是这样的:
def get_sub_strings(s):
words = s.split()
for i in xrange(1, len(words)+1): #reverse the order here
for n in xrange(0, len(words)+1-i):
yield ' '.join(words[n:n+i])
...
>>> out = []
>>> for word in c:
for sub in get_sub_strings(word.lower()):
for s in isl:
if sub in s.lower():
out.append(sub)
...
>>> out
['john', 'query', '989877', 'query 989877', 'tamm']
如果您只想存储最大的匹配项,那么您需要以相反的顺序生成子字符串,并在找到匹配项后立即中断isl
:
def get_sub_strings(s):
words = s.split()
for i in xrange(len(words)+1, 0, -1):
for n in xrange(0, len(words)+1-i):
yield ' '.join(words[n:n+i])
out = []
for word in c:
for sub in get_sub_strings(word.lower()):
if any(sub in s.lower() for s in isl):
out.append(sub)
break
print out
#['john', 'query 989877', 'tamm']
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)