2017-02-02 13 views
0

Я запрашивая пользователей от активного источника каталогов и вытягивать их имена, от их я пытаюсь тянуть ближайший матч с помощью данного входа: Однаконайти ближайший матч в строку

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 не будет тянуть ближайший матч.

Например, предположим, что пользователь вводит «Перкинс, Томас»:

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

Есть ли способ я могу получить difflib вытащить матч, основываясь на том, сколько символов совпадают в данных критериях? Я искал документы и не мог ничего найти при изменении критериев соответствия для difflib.

+1

«Возможные действия» должен быть списком строк, в то время как ваш 'new_user' является одной строкой. Кроме того, не могли бы вы собрать все имена из запроса в одном списке и затем использовать 'get_close_matches()' для всех из них сразу? – hop

ответ

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 будет отменен cutoff=1.0 в вызове difflib, так как там будет только 1 точное соответствие имени в valid_users.