Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I parse the people's first and last name in Python?

Tags:

python

parsing

So basically I need to parse a name and find the following info:

  • First Name

  • First Initial (if employee has initials for a first name like D.J., use both initials)

  • Last Name (include if employee has a suffix such as Jr. or III.)


So here's the interface I'm working with:

Input:

names = ["D.J. Richies III", "John Doe", "A.J. Hardie Jr."]
for name in names:
   print parse_name(name)

Expected Output:

{'FirstName': 'D.J.', 'FirstInitial': 'D.J.', 'LastName': 'Richies III' }
{'FirstName': 'John', 'FirstInitial': 'J.', 'LastName': 'Doe' }
{'FirstName': 'A.J.', 'FirstInitial': 'A.J.', 'LastName': 'Hardie Jr.' }

Not really good at Regex, and actually that's probably overkill for this. I'm just guessing:

if name[1] == ".":  # we have a name like D.J.?
like image 593
y2k Avatar asked Nov 12 '09 07:11

y2k


People also ask

How do you split first name middle name and last name in Python?

split() print(f"{first}, {middle[0] if middle else ''}, {last}") Using the packing operator * for the second variable name will place any remaining values (names) into a list by the name 'middle'.

How do you print a last name in Python?

fullname(str1) /* str1 is a string */ Step 1: first we split the string into a list. Step 2: newspace is initialized by a space(“”) Step 3: then traverse the list till the second last word. Step 4: then adds the capital first character using the upper function. Step 5: then get the last item of the list.

Which command will give the output as what is your name in Python?

answer = input('What is your name? ')


4 Answers

I found this library quite useful for parsing names. https://code.google.com/p/python-nameparser/

It can also deal with names that are formatted Lastname, Firstname.

like image 77
Hamish Currie Avatar answered Oct 27 '22 23:10

Hamish Currie


There is no general solution and solution will depend on the constraints you put. For the specs you have given here is a simple solution which gives exactly what you want

def parse_name(name):
   fl = name.split()
   first_name = fl[0]
   last_name = ' '.join(fl[1:])
   if "." in first_name:
      first_initial = first_name
   else:
      first_initial = first_name[0]+"."

   return {'FirstName':first_name, 'FirstInitial':first_initial, 'LastName':last_name}

names = ["D.J. Richies III", "John Doe", "A.J. Hardie Jr."]
for name in names:
   print parse_name(name)

output:

{'LastName': 'Richies III', 'FirstInitial': 'D.J.', 'FirstName': 'D.J.'}
{'LastName': 'Doe', 'FirstInitial': 'J.', 'FirstName': 'John'}
{'LastName': 'Hardie Jr.', 'FirstInitial': 'A.J.', 'FirstName': 'A.J.'}
like image 26
Anurag Uniyal Avatar answered Oct 27 '22 21:10

Anurag Uniyal


Well, for your simple example names, you can do something like this.

# This separates the first and last names
name = name.partition(" ")
firstName = name[0]
# now figure out the first initial
# we're assuming that if it has a dot it's an initialized name,
# but this may not hold in general
if "." in firstName:
    firstInitial = firstName
else:
    firstInitial = firstName[0] + "."
lastName = name[2]
return {"FirstName":firstName, "FirstInitial":firstInitial, "LastName": lastName}

I haven't tested it, but a function like that should do the job on the input example you provided.

like image 35
Daniel G Avatar answered Oct 27 '22 23:10

Daniel G


This is basically the same solution as the one Anurag Uniyal provided, only a little more compact:

import re

def parse_name(name):
    first_name, last_name = name.split(' ', 1)
    first_initial = re.search("^[A-Z.]+", first_name).group()
    if not first_initial.endswith("."):
        first_initial += "."
    return {"FirstName": first_name,
            "FirstInitial": first_initial,
            "LastName": last_name}
like image 41
Pär Wieslander Avatar answered Oct 27 '22 23:10

Pär Wieslander