我正在查询来自活动目录源的用户并提取他们的名字,我试图通过给定的输入拉出最接近的匹配:
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
的匹配条件的任何内容。
答案 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}}。