如果包含在一组字符串中,则匹配字符串的Pythonic方法

时间:2017-07-24 00:17:59

标签: python string

我正在尝试使用第一个,第二个和最后一个名称来匹配名称,无论是否使用所有这些名称都是正确的顺序。到目前为止,我已经有了这个代码并且它有点工作,但我认为这不是正确的方法。你知道另一种方法吗?

数据集中的名称如下所示:

name = 'DAVID SCOTT MUSTAIN'

如果我搜索'DAVID''MUSTAIN SCOTT''SCOTT DAVID'等,我想要的是匹配该名称。 到目前为止,我得到的功能如下:

def search_name(somename):   
    for full_name in some_dataset:
        if set(somename.upper().split()).issubset(full_name.split()):
            print('match:', full_name)

如果我输入'DAV''SCOT'之类的内容,则无法匹配任何内容。即使名字不完整,我该如何进行比赛呢?如果我分手了  将这些名称分成单个字母,它将使用这些字母匹配每个名称而不检查字母的顺序。

3 个答案:

答案 0 :(得分:2)

您可以使用any检查somename中的任何名称是full_name

中任何名称的子集
def search_name(somename):   
    for full_name in some_dataset:
        if any(n.upper() in fn for n in somename.split() for fn in full_name.split()):
            print('match:', full_name)

以下是使用sum和字典来选择匹配最多的名称的示例:

def search_name(somename):  
    matches = {} 
    for full_name in some_dataset:
        matches[full_name] = sum(1 for n in somename.split() for fn in full_name.split() if n.upper() in fn)
    best_matches = [k for k,v in matches.items() if v == max(matches.values()) if v != 0]
    for match in best_matches: 
        print('match:', match)

我确定有更好的方法可以写这个功能,但我的睡眠非常困难。
至于你的第二个问题,也许你可以打印/返回best_matches列表中的所有项目?

答案 1 :(得分:1)

我做了一个使用更多语句的小功能

def search_name(name, toSearch, num = 2):
    found = []
    for word in name.split():
        search = word[:num]
        for letter in word[num:]:
            search += letter
            isThere = [data for data in toSearch.split() if data in search]
            if isThere:
                found += isThere
                break
    return len(toSearch.split()) == len(found)

name = 'DAVID SCOTT MUSTAIN'
if search_name(name,'TA'):
    print(name)
else:
    print('Nothing')

你想要这个吗?

答案 2 :(得分:0)

我可以使用

if full_name in somename and not set(full_name.split()) - set(someone.split())

查看它是否是一个子字符串,并且它不包含额外的短名称。