24

好的,所以基本上我在问他们名字的问题,我希望这是一个输入,而不是名字和姓氏。

现在有什么方法可以拆分这个名字吗?并从“句子”中取出最后一个词,例如

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

输出的只是“冬天”

4

16 回答 16

65

您会发现这种方法的关键问题不是技术问题,而是人类问题 - 不同的人以不同的方式书写他们的名字。

事实上,“姓”和“姓”的用语本身就有缺陷。

虽然许多混合家庭使用连字符的姓氏,例如 Smith-Jones,但有些人只是分别使用这两个名字,“Smith Jones”,其中两个名字都是姓氏。

许多欧洲姓氏有多个部分,例如“de Vere”和“van den Neiulaar”。有时这些临时演员有​​重要的家族历史——例如,几百年前国王授予的前缀。

附带问题:我已经为我所引用的人正确地大写了这些 - “de”和“van den”对于某些家庭没有大写字母,但对于其他家庭却有。

相反,许多亚洲文化将姓氏放在首位,因为家庭被认为比个人更重要。

最后一点 - 有些人非常重视“初级”或“高级”或“III” - 你的代码不应该将它们视为姓氏。

还注意到有相当多的人使用的名字不是他们父母赋予的名字,我使用了以下方案并取得了一些成功:

全名(通常用于寻址邮件);姓; Known As(谈话中常用的名称)。

例如:

全名:威廉·盖茨三世;姓氏:盖茨;别名:比尔

全名:宋丽;姓氏:宋;别名:丽莎

于 2008-11-03T19:42:02.833 回答
15

尝试从单个输入中拆分姓名的问题在于,您将无法获得姓氏中有空格的人的完整姓氏,而且我不相信您将能够编写代码来完全管理它。

如果可能的话,我建议您单独询问姓名。

于 2008-11-03T19:23:04.697 回答
15

这是一个相当老的问题,但我发现它正在寻找一种解决方案来从一个全局名称中解析出片段。

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

于 2010-05-19T03:05:27.777 回答
8

一个简单的方法来完全按照你在 python 中的要求是

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

(注意函数调用 split 的括号。)

split() 创建一个列表,其中每个元素都来自您的原始字符串,由空格分隔。您现在可以使用 name.split()[1] 获取第二个元素或使用 name.split()[-1] 获取最后一个元素

然而,正如其他人所说,除非你确定你只是得到一个像“First_Name Last_Name”这样的字符串,否则会涉及更多的问题。

于 2008-11-03T20:20:52.553 回答
6

数据的黄金法则 - 不要太早聚合 - 将字段粘合在一起比将它们分开要容易得多。大多数人还有一个中间名,它应该是一个可选字段。有些人有过多的中间名。有些人只有一个名字,一个字。一些文化通常有一本中间名词典,向 Golgafrincham Ark 登陆的家谱致敬。

您在这里不需要代码解决方案 - 您需要一个业务规则。

于 2008-11-03T20:18:25.910 回答
4

这就是我在我的应用程序中的做法:

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')
于 2012-02-16T03:45:20.910 回答
4

像这样:

print name.split()[-1]
于 2008-11-03T19:20:27.480 回答
4

如果您尝试在 PHP 中解析人名,我推荐Keith Beckman 的 nameparse.php 脚本

于 2009-11-01T02:45:02.357 回答
3

由于人们写名字的方式有很多不同的变化,但这里是通过正则表达式获取名字/姓氏的基本方法。

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')
于 2008-11-04T20:35:29.323 回答
2

拆分名称比看起来更难。有些名字有两个姓氏;有些人会输入名字、中间名和姓氏;有些名字有两个工作名字。处理姓名的更可靠(或最不可靠)的方法是始终在单独的字段中捕获名字和姓氏。当然,这会引发它自己的问题,比如如何处理只有一个名字的人,确保它适用于名字部分顺序不同的用户。

名字很难,小心处理。

于 2008-11-03T19:30:06.243 回答
1

这绝对是一项比表面上看起来更复杂的任务。我在博客上写了一些挑战以及解决它的算法。如果您想要 PHP 的最新版本,请务必查看我的 Google 代码项目:

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

于 2010-09-10T22:28:26.353 回答
0

您可能希望为此使用 rsplit:

rsplit([sep [,maxsplit]])

返回字符串中的单词列表,sep用作分隔符字符串。如果maxsplit给出,最多maxsplit拆分完成,最右边的拆分。如果sep未指定 or None,则任何空白字符串都是分隔符。除了从右侧拆分外,rsplit()其行为如下文split()详细描述。2.4 版中的新功能。

于 2008-11-03T19:21:27.617 回答
0

这是在 SQL 中执行此操作的方法。但是用这种东西进行数据归一化真的很麻烦。我同意 Dave DuPlantis 关于要求单独输入的观点。

于 2008-11-03T19:30:41.780 回答
0

我会指定一种标准格式(某些表格使用它们),例如“请以名字,姓氏形式写下您的名字”。

它使您更容易,因为名称通常不包含逗号。它还验证您的用户是否实际输入了名字和姓氏。

于 2008-11-03T19:59:30.847 回答
0
name = "Thomas Winter"
first, last = name.split()
print("First = {first}".format(first=first))
#First = Thomas
print("Last = {last}".format(last=" ".join(last)))
#Last = Winter
于 2019-05-15T13:12:30.687 回答
0

你可以用str.find()这个。

x=input("enter your name ")
l=x.find(" ")
print("your first name is",x[:l])
print("your last name is",x[l:])
于 2019-12-10T17:01:25.637 回答