Python:检查两个列表中字符串的部分匹配

4

我有两个列表如下所示:

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",我该怎么做才能得到我想要的结果呢?


它必须是“query 989877”吗?还是可以是“query”,“989877”? - David.Jones
是的...我想要所有匹配项(部分和完全匹配)。 - user1452759
2个回答

4
也许是这样的东西:
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']

这真的很棒!是否有任何方法可以从“out”列表中删除“query”和“989877”?因为理想情况下它们不应该出现在输出结果中。我坚持这样做的原因是,我需要对“out”列表中的所有元素进行计数,稍后会得到错误的答案,如果我按照你所显示的输出保留它们。 - user1452759
@user1452759,请检查我的第二个解决方案。 - Ashwini Chaudhary
非常感谢!这太完美了! - user1452759

0
好的,我想到了一个方法!这是一种非常粗糙的做法;虽然我自己不太喜欢这个方法,但它能给我想要的结果。
Step1:
in: c1 = []
    for r in c:
       c1.append(r.split()) 
out: c1 = [['John'], ['query', '989877', 'forcast'], ['Tamm']]


Step2:
in: p = []
    for w in isl:
        for word in c1:
            for w1 in word:
                 if w1.lower() in w.lower():
                         p.append(w1)
out: p = ['query', '989877', 'John', 'Tamm']


Step3:
in: out = []
    for word in c:
        t = []
        for i in p:
             if i in word:
                t.append(i)
        out.append(t)
out: out = [['John'], ['query', '989877'], ['Tamm']]

Step4:
in: out_final = []
    for i in out:
        out_final.append(" ".join(e for e in i))
out: out_final = ['John', 'query 989877', 'Tamm']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接