5 回答

TA貢獻1798條經驗 獲得超3個贊
庫nameparse是您問題的完美解決方案。您可以通過以下方式安裝它
pip 安裝名稱解析器
在您的代碼中,將此庫導入為:
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貢獻1735條經驗 獲得超5個贊
使用 split 函數創建包含名稱的列表 第一個是名字 第二個是您的姓氏(如果名稱長度等于 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貢獻1993條經驗 獲得超6個贊
我們可以使用以下正則表達式:
(?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'}
請注意,match將從頭到尾匹配整個字符串。請確保事先清理并驗證您的輸入,因為正則表達式對于它們不期望的輸入有些脆弱。

TA貢獻1780條經驗 獲得超5個贊
您可以使用str.split并len檢查結果:
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貢獻1836條經驗 獲得超13個贊
Python 有一個稱為“解包”的功能,它允許您從列表中解構對象。有問題的列表來自調用split
字符串上的方法。它需要一個字符串來分割。要解包,您必須具有以下形式的聲明[a, b, c] = list
,其中 a、b 和 c 是您希望解包(按順序)的對象。所以你的代碼是
[first, middle, last] = 'John Wayne Smith'.split(' ')
添加回答
舉報