web-dev-qa-db-ja.com

人の名前を姓と名に分割する

わかりました。基本的に、名前の質問をします。これを、姓と名ではなく1つの入力にします。

この名前を分割する方法はありますか? 「文」から最後の単語だけを取り出します。

name = "Thomas Winter"
print name.split() 

出力されるのは「冬」だけです

22
Nick

このアプローチの主な問題は技術的な問題ではなく、人間的な問題であることがわかります。人によって名前の書き方が異なります。

実際、「名字」と「姓」という用語自体に欠陥があります。

多くの混合ファミリは、Smith-Jonesのようにハイフンでつながれた姓を使用しますが、両方の名前を別々に使用する「SmithJones」もあります。

多くのヨーロッパの姓には、「deVere」や「vandenNeiulaar」などの複数の部分があります。これらのエキストラには、重要な家族歴がある場合があります。たとえば、数百年前に王から授与された接頭辞などです。

副次的な問題:参照している人のために、これらを正しく大文字にしました。「de」と「van den」は、一部の家族では大文字を使用しませんが、他の家族では使用します。

逆に、多くのアジアの文化では、個人よりも家族の方が重要であると考えられているため、姓が最初に置かれています。

最後のポイント-一部の人々は「ジュニア」または「シニア」または「III」であることに素晴らしい店を置きます-そしてあなたのコードはそれらを姓として扱うべきではありません。

また、両親から与えられた名前ではない名前を使用する人がかなりの数いることにも注意して、私は次のスキームを使用してある程度の成功を収めました。

フルネーム(通常、メールの宛先として書かれているとおり)。苗字;別名(会話で一般的に使用される名前)。

例えば:

フルネーム:William Gates III;姓:ゲイツ;別名:ビル

フルネーム:Soong Li;姓:スン;別名:リサ

63
Bevan

単一の入力から名前を分割しようとする場合の問題は、姓にスペースがある人の完全な姓を取得できないことです。これを完全に管理するコードを記述できるとは思いません。

可能であれば、名前を個別に尋ねることをお勧めします。

14
Dave DuPlantis

これはかなり古い問題ですが、グロブされた名前から断片を解析するための解決策を探していることがわかりました。

http://code.google.com/p/python-nameparser/

10
Xealot

データの黄金律-早すぎないでください-フィールドを分離するよりも、フィールドを接着する方がはるかに簡単です。ほとんどの人は、オプションのフィールドであるはずのミドルネームも持っています。ミドルネームがたくさんある人もいます。一部の人々は 1つの名前 、1つの単語しか持っていません。いくつかの文化は一般的にミドルネームの辞書を持っており、ゴルガフリンチャムアークの着陸に戻って家系図に敬意を表しています。

ここではコードソリューションは必要ありません。ビジネスルールが必要です。

6
CAD bloke

pythonであなたが尋ねたことを正確に行う簡単な方法は

name = "Thomas Winter"
LastName = name.split()[1]

(関数呼び出しsplitの括弧に注意してください。)

split()は、各要素が元の文字列からのものであり、空白で区切られたリストを作成します。これで、name.split()[1]を使用して2番目の要素を取得するか、name.split()[-1]を使用して最後の要素を取得できます。

ただし、他の人が言ったように、「First_Name Last_Name」のような文字列を取得していることが確実でない限り、さらに多くの問題が関係しています。

6
Baltimark

これが私のアプリケーションでのやり方です:

def get_first_name(fullname):
    firstname = ''
    try:
        firstname = fullname.split()[0] 
    except Exception as e:
        print str(e)
    return firstname

def get_last_name(fullname):
    lastname = ''
    try:
        index=0
        for part in fullname.split():
            if index > 0:
                if index > 1:
                    lastname += ' ' 
                lastname +=  part
            index += 1
    except Exception as e:
            print str(e)
    return lastname

def get_last_Word(string):
    return string.split()[-1]

print get_first_name('Jim Van Loon')
print get_last_name('Jim Van Loon')
print get_last_Word('Jim Van Loon')
4
Ryan Flores

PHPで人間の名前を解析しようとしている場合は、 Keith Beckmanの名前parse.phpスクリプト をお勧めします。

4
Jonathon Hill

このような:

print name.split()[-1]
3
JesperE

名前の分割は見た目より難しいです。一部の名前には2つのWordの姓があります。一部の人は、姓名を入力します。一部の名前には2つの作業名があります。名前を処理するためのより信頼性の高い(または最も信頼性の低い)方法は、常に姓名を別々のフィールドに取り込むことです。もちろん、これは、名前が1つしかないユーザーを処理する方法など、独自の問題を引き起こし、名前部分の順序が異なるユーザーに対して確実に機能するようにします。

名前は難しいので、取り扱いには注意してください。

2
acrosman

人々が自分の名前を書く方法には非常に多くの異なるバリエーションがあるので、正規表現を介して名/姓を取得する基本的な方法は次のとおりです。

import re
p = re.compile(r'^(\s+)?(Mr(\.)?|Mrs(\.)?)?(?P<FIRST_NAME>.+)(\s+)(?P<LAST_NAME>.+)$', re.IGNORECASE)
m = p.match('Mr. Dingo Bat')
if(m != None):
  first_name = m.group('FIRST_NAME')
  last_name = m.group('LAST_NAME')
2
UberJumper

これは、表面に表示されるよりも間違いなく複雑な作業です。いくつかの課題とそれを解決するためのアルゴリズムをブログに書きました。 PHPの最新バージョンが必要な場合は、必ず私のGoogleCodeプロジェクトをチェックしてください。

http://www.onlineaspect.com/2009/08/17/splitting-names/

1
Josh Fraser

これにはstr.find()を使用できます。

x=input("enter your name ")
l=x.find(" ")
print("your first name is",x[:l])
print("your last name is",x[l:])
0
Gaurav Meena

これにはおそらくrsplitを使用することをお勧めします。

rsplit([sep [、maxsplit]])

区切り文字列としてsepを使用して、文字列内の単語のリストを返します。 maxsplitが指定されている場合、最大でmaxsplit分割が実行され、右端の分割が実行されます。 sepが指定されていないか、Noneの場合、空白文字列は区切り文字になります。右から分割することを除いて、rsplit()はsplit()のように動作します。これについては、以下で詳しく説明します。バージョン2.4の新機能。

0
Adam Alexander

SQLでそれを行う方法は次のとおりです 。しかし、この種のデータの正規化は本当に負担です。個別の入力を求めることについて、DaveDuPlantisに同意します。

0
JosephStyons

「名前を名、姓フォームに記入してください」などの標準形式(一部のフォームでは使用されます)を指定します。

名前には通常コンマが含まれていないため、簡単になります。また、ユーザーが実際に名と姓の両方を入力していることも確認します。

0
Bogdan
name = "Thomas Winter"
first, last = name.split()
print("First = {first}".format(first=first))
#First = Thomas
print("Last = {last}".format(last=" ".join(last)))
#Last = Winter
0
Kurtis Pykes