2017-06-17 219 views
2

嘗試確定單個姓氏。在Python中解析姓氏從姓名中解析姓氏

names = ["John Smith", "D.J. Richies III","AJ Hardie Jr.", "Shelia Jackson-Lee", "Bob O'Donnell"] 

所需的輸出

last_names = ['Smith', 'Richies','Hardie','Lee', 'ODonnell' ] 

我希望有一個現有庫或一組代碼,可以輕鬆處理其中的一些更罕見/多宗。

感謝您的幫助!

+2

要求人們推薦圖書館通常不被認爲是合適的問題。你有什麼嘗試?看起來你只需要在'str.split()'後取第二個單詞並去除標點符號,這對標準字符串函數來說很簡單。 – AChampion

+0

問題出現在連字符名稱中。我明白你的意思,但可能是兩個分裂(第二個覆蓋複數名字),然後是一個壓縮。 只是不知道是否有一個每個人都使用的庫,我不知道是否存在(對Python來說是相當新的)。 – nonegiven72

+0

另外如果你有中間名?或者是沒有連字符的兩個記號的姓氏? –

回答

7

處理地名是硬

樸素字符串處理的解決方案最終將失敗。你開始意識到這個後綴(III,Jr.),但是像de la Paz這樣的複合姓氏呢?

你想: The Python Human Name Parser

>>> from nameparser import HumanName 
>>> name = HumanName("Dr. Juan Q. Xavier de la Vega III") 
>>> name.title 
'Dr.' 
>>> name["title"] 
'Dr.' 
>>> name.first 
'Juan' 
>>> name.middle 
'Q. Xavier' 
>>> name.last 
'de la Vega' 
>>> name.suffix 
'III' 
1

你可以試試這個:

names = ["John Smith", "D.J. Richies III","AJ Hardie Jr.", "Shelia Jackson-Lee", "Bob O'Donnell"] 

suffixes = ["II", "Jr.", "III", "Sr."] 

last_names = [] 

for i in names: 
    new_name = i.split() 
    if len(new_name) == 2 and "-" in new_name[1]: 
     last_names.append(new_name[1].split("-")[1]) 

    elif len(new_name) == 2: 
      last_names.append(new_name[1]) 

    else: 
     if new_name[-1] in suffixes: 
      last_names.append(new_name[1]) 

print(last_names) 

輸出將包含姓氏:

['Smith', 'Richies', 'Hardie', 'Lee', "O'Donnell"] 
+0

這可以結合一個後綴列表去除。 –

-1

試試這個代碼。確保你有像[「姓名」]這樣的列表。

names = ["John Smith", "D.J. Richies III","AJ Hardie Jr.", "Shelia Jackson-Lee", "Bob O'Donnell"] 
out = [] 
for n in names: 
    out.append(n.split(" ")[1]) 
print out 
+0

複合姓氏如「德拉維加」或「聖約翰」失敗。 –