2013-06-05 95 views
1

我已經有了一段簡單的代碼,它匹配兩個文本文件中的網絡用戶名。我試圖通過將兩個輸入都改爲大寫來標準化輸入,但是我需要進一步使它進入一個階段,並讓我的代碼產生用戶名的部分匹配。我可能會把SMITH,JOHN列入一份名單,或許還有另一份名單中的SMITH,JOHN(FINANCE)。我已經看過FuzzyWuzzy,但是我只是在學習Python幾個星期,並且我很難理解如何在腳本中使用它。在兩個文本文件中的Python模糊匹配

with OpenUpperCase(filename, "r")as file1: 
    for line in islice(file1,20,None): 
     with OpenUpperCase ("c:\\Files\Usernames.txt", "r") as file2: 
      files= filename.upper().split("\\") 
      int1=files[3].strip() 
      filedate=int1[0:-4] 
      list2 = file2.readlines() 
      for i in file1: 
       for j in list2: 
        if i == j: 

這是我到目前爲止,可能沒有很好的編碼,但它似乎工作。有什麼想法可以讓我的用戶名模糊匹配嗎? 非常感謝您提供的任何幫助。

編輯。

通常,我的列表將如下所示。顯然有數百個用戶。

文件1

Salt, William (old user) 
Wilds, Tony 
Smith, William (Old User) 
JONES,Steven (Old User) 

文件2

Salt, Bill 
Wilds, Tony (SALES) 
Smith,Will (OLD USER) 
JONES,STEVEN (ACCOUNTS) 
+0

可不可以給你列出的樣本? – zhangyangyu

+0

@張揚宇附件給你一個想法。 – user2377057

+0

感謝@MikeMüller將其編輯爲更易讀的格式。 – user2377057

回答

1

使用爲簡單起見stringIO對象:

file1 = io.StringIO("""Salt, William (old user) 
Wilds, Tony 
Smith, William (Old User) 
JONES,Steven (Old User)""") 

file2 = io.StringIO("""Salt, Bill 
Wilds, Tony (SALES) 
Smith,Will (OLD USER) 
JONES,STEVEN (ACCOUNTS)""") 

閱讀所有的名字爲一組:

def read_file(fobj): 
    names = set() 
    for line in fobj: 
     split_line = line.lower().split(',') 
     names.add((split_line[0], split_line[1].split()[0])) 
    return names 

對於每個文件:

data1 = read_file(file1) 
data2 = read_file(file2) 

一個簡單的交叉點就可以了:

data1.intersection(data2) 

結果:

set([('wilds', 'tony'), ('jones', 'steven')]) 
+0

這是很大的幫助。謝謝@MikeMüller – user2377057