2017-06-17 1 views
2

姓を1つ決定しようとしています。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()'の後ろにある2番目の単語を取り除いて句読点を削除する必要があるようですが、これは標準の文字列関数で行うのは簡単です。 – AChampion

+0

問題はハイフネーションされた名前になります。私はそれが2つの分割(ハイフネーションされた名前をカバーするために2番目)であり、それからコンパクトであるかもしれないが、あなたが意味することを理解する。 誰もが使用していたライブラリがあったかどうか分かりませんでした。私には分かりませんでした(かなり新しいものです)。 – nonegiven72

+0

また、ミドルネームがあればどうですか?または、ハイフンなしの2つのトークンである姓 –

答えて

7

は、名前の対処を

ナイーブ文字列操作ソリューションは、最終的に失敗するハードです。接尾辞(IIIJr.)でこれを認識し始めますが、化合物の姓は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

は、このコードを試してみてください。 ["name surename"]のようなリストがあることを確認してください。

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

"de la Vega"や "St. John"のような化合物の姓では失敗します。 –

関連する問題