5 回答

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超3個(gè)贊
庫nameparse是您問題的完美解決方案。您可以通過以下方式安裝它
pip 安裝名稱解析器
在您的代碼中,將此庫導(dǎo)入為:
from nameparser import HumanName
name = "John Wayne Smith"
name_parts = HumanName(name)
name_parts.title
name_parts.first
name_parts.middle
name_parts.last
name_parts.suffix
name_parts.nickname
name_parts.surnames # (middle + last)
name_parts.initials # (first initial of each name part)

TA貢獻(xiàn)1735條經(jīng)驗(yàn) 獲得超5個(gè)贊
使用 split 函數(shù)創(chuàng)建包含名稱的列表 第一個(gè)是名字 第二個(gè)是您的姓氏(如果名稱長度等于 2)
names =Name.split()
if len(names) ==2 :
print("there is no middle name")
first_name = names[0]
last_name = names[1]
print(f" first name - {first_name}\n middle name - last name - {last_name}")
elif len(names) == 3:
print("there is middle name")
first_name = names[0]
middle_name = names[1]
last_name = names[2]
print(f" first name - {first_name}\n middle name - {middle_name} \nlast name - {last_name}")

TA貢獻(xiàn)1993條經(jīng)驗(yàn) 獲得超6個(gè)贊
我們可以使用以下正則表達(dá)式:
(?P<First>\S+)\s(?:(?P<Middle>\S*)\s)?(?P<Last>\S+)$
它查找名字和姓氏,以及可選的中間名。
例子
import re
s = "John Wayne Smith"
s2 = "John Smith"
p = re.compile(r"(?P<First>\S+)\s(?:(?P<Middle>\S*)\s)?(?P<Last>\S+)$")
p.match(s).groupdict()
# {'First': 'John', 'Middle': 'Wayne', 'Last': 'Smith'}
p.match(s2).groupdict()
# {'First': 'John', 'Middle': None, 'Last': 'Smith'}
請(qǐng)注意,match將從頭到尾匹配整個(gè)字符串。請(qǐng)確保事先清理并驗(yàn)證您的輸入,因?yàn)檎齽t表達(dá)式對(duì)于它們不期望的輸入有些脆弱。

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超5個(gè)贊
您可以使用str.split并len檢查結(jié)果:
name = "John Wayne Smith"
parts = name.split(maxsplit=3)
if len(parts) == 3:
first, middle, last = parts
else:
first = parts[0]
middle = ""
last = parts[-1]
print([first, middle, last])

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超13個(gè)贊
Python 有一個(gè)稱為“解包”的功能,它允許您從列表中解構(gòu)對(duì)象。有問題的列表來自調(diào)用split
字符串上的方法。它需要一個(gè)字符串來分割。要解包,您必須具有以下形式的聲明[a, b, c] = list
,其中 a、b 和 c 是您希望解包(按順序)的對(duì)象。所以你的代碼是
[first, middle, last] = 'John Wayne Smith'.split(' ')
添加回答
舉報(bào)