【问题标题】:Finding the closest match to a string查找与字符串最接近的匹配项
【发布时间】:2017-02-02 17:59:34
【问题描述】:

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

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 的匹配条件的内容。

【问题讨论】:

  • possibilities 应该是字符串列表,而您的 new_user 是单个字符串。另外,您不会将查询中的所有名称收集在一个列表中,然后然后对所有名称同时使用get_close_matches() 吗?

标签: python string python-2.7 match


【解决方案1】:

如果您转换返回的数据,这应该是可行的

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 覆盖,因为在 valid_users 中只有 1 个完全匹配的名称。

【讨论】:

    猜你喜欢
    • 2017-07-13
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    • 2015-09-29
    • 1970-01-01
    • 2011-08-17
    相关资源
    最近更新 更多