3

姓が大文字で、名とミドルネームが通常の名前のセットがあります。

OBAMA Barack
DEL MONTE Alfredo

これらに分けたい

"OBAMA", "Barack"
"DEL MONTE", "Alfredo"

これを達成するためのpythonicの方法は何ですか?

4

4 に答える 4

8
>>> import itertools
>>> [
...    ' '.join(items)
...    for _, items in itertools.groupby('DEL MONTE Alfredo'.split(), str.isupper)
... ]
['DEL MONTE', 'Alfredo']
于 2012-04-30T07:44:00.330 に答える
2
def split_names(names):
    for s in names:
        last_names = []
        name_parts = s.split()
        while name_parts and name_parts[0].isupper():
            last_names.append(name_parts.pop(0))
        yield ' '.join(last_names), ' '.join(name_parts)


names = ["OBAMA Barack", "DEL MONTE Alfredo"]
for last_name, first_name in split_names(names):
    print last_name
    print first_name
    print

プリント:

OBAMA
Barack

DEL MONTE
Alfredo
于 2012-04-30T07:43:17.737 に答える
2

You can use a simple regular expression:

import re

a = "DEL MONTE Alfredo"
first, last = re.match(r'([A-Z ]+)\s+(.+)', a).groups()

or loop thru a list of words and filter out all-uppercase ones:

first = ' '.join(w for w in a.split() if w.isupper())
last =  ' '.join(w for w in a.split() if not w.isupper())

In my personal opinion, "the most pythonic" === "the simplest".

于 2012-04-30T09:04:52.570 に答える
0

これを試してください:

(?![A-Z][a-z])([A-Z ]+) ([A-Z][a-z]+)
于 2012-04-30T07:44:29.740 に答える