查找与字符串最接近的匹配项

时间:2017-02-02 17:59:35

标签: python string python-2.7 match

我正在查询来自活动目录源的用户并提取他们的名字,我试图通过给定的输入拉出最接近的匹配:

from pyad import adquery
import difflib


data = []
q = adquery.ADQuery()
q.execute_query(
    base_dn="some info"

)

data_given = raw_input("Enter user(last,first): ")

for row in q.get_results():
    item = row["distinguishedName"]
    user = ''.join(item.split(",")[0:2:])
    new_user = user.replace("\\", ",").replace("CN=", "")
    print new_user
    if new_user == data_given:
        data = [new_user]
    else:
        data = difflib.get_close_matches(data_given, new_user, n=10, cutoff=1.0)


if not data:
    print "No user was found with the criteria given."
else:
    print data

但是,我拉的用户最终会看起来像这样:

Kadiyala, Chndr
Doulas, Jh P.
Perkins, Thomas - OSM-OCO CTR
Lattsw, Tamka M - OAM OCO

difflib不会拉最近的匹配。

例如,假设用户输入“Perkins,Thomas”:

Enter user(last,first): Perkins, Thomas
No user was found with the criteria given.

有没有办法让difflib根据给定条件中匹配的字符数来匹配匹配?我搜索了文档,似乎无法找到更改difflib的匹配条件的任何内容。

1 个答案:

答案 0 :(得分:0)

如果您从

转换返回的数据,这应该是可行的
q.get_results()

到名单列表中,例如

users_list = ['Kadiyala, Chndr', 'Doulas, Jh', ...]

其中名称都被删除了额外的数据,例如Perkins, Thomas - OSM-OCO CTR - > Perkins, Thomas。这可以使用正则表达式完成(请参阅https://docs.python.org/2/library/re.html)。试试

valid_users = []
for name in users_list:
     valid_users.append(re.match('\\w+(,)\\s{1}\\w+', name).group(0))

然后你可以运行

data = difflib.get_close_matches(data_given, valid_users, n=10, cutoff=1.0)

获得最多10个具有指定名称的用户。

但是,如果您的用户名称是唯一的,则n=10会在difflib调用中被cutoff=1.0覆盖,因为{{1}中只有1个完全匹配的名称1}}。