使用split():
names = ["John M. Drell", "John Drell"]
for name in names:
firstname, *middlenames, lastname = name.split()
print(f'First name: {firstname}, Middle name(s): {" ".join(middlenames)}, Last name: {lastname}')
见Python proof。
通过正则表达式,学习使用可选组和\S 来匹配任何非空白字符:
^(?P<firstname>\S+)(?:\s+(?P<middlename>\S+(?: +\S+)*))?\s+(?P<lastname>\S+)$
见regex proof。
解释
--------------------------------------------------------------------------------
^ the beginning of the string
--------------------------------------------------------------------------------
(?P<firstname> group and capture to "firstname":
--------------------------------------------------------------------------------
\S+ non-whitespace (all but \n, \r, \t, \f,
and " ") (1 or more times (matching the
most amount possible))
--------------------------------------------------------------------------------
) end of "firstname"
--------------------------------------------------------------------------------
(?: group, but do not capture (optional
(matching the most amount possible)):
--------------------------------------------------------------------------------
\s+ whitespace (\n, \r, \t, \f, and " ") (1
or more times (matching the most amount
possible))
--------------------------------------------------------------------------------
(?P<middlename> group and capture to "middlename":
--------------------------------------------------------------------------------
\S+ non-whitespace (all but \n, \r, \t,
\f, and " ") (1 or more times
(matching the most amount possible))
--------------------------------------------------------------------------------
(?: group, but do not capture (0 or more
times (matching the most amount
possible)):
--------------------------------------------------------------------------------
+ ' ' (1 or more times (matching the
most amount possible))
--------------------------------------------------------------------------------
\S+ non-whitespace (all but \n, \r, \t,
\f, and " ") (1 or more times
(matching the most amount possible))
--------------------------------------------------------------------------------
)* end of grouping
--------------------------------------------------------------------------------
) end of "middlename"
--------------------------------------------------------------------------------
)? end of grouping
--------------------------------------------------------------------------------
\s+ whitespace (\n, \r, \t, \f, and " ") (1 or
more times (matching the most amount
possible))
--------------------------------------------------------------------------------
(?P<lastname> group and capture to "lastname":
--------------------------------------------------------------------------------
\S+ non-whitespace (all but \n, \r, \t, \f,
and " ") (1 or more times (matching the
most amount possible))
--------------------------------------------------------------------------------
) end of "lastname"
--------------------------------------------------------------------------------
$ before an optional \n, and the end of the
string