tags:

views:

152

answers:

3

Thanks so much everyone who helped!

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.?

Eh, I don't know, haven't been working with Python very long.

Any help would be GREATLY appreciated! Thanks :)

Thanks so much everyone who helped, you saved my life!

+2  A: 

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.

Daniel G
Thanks for helping me again Daniel, you rock.
Joshua
+2  A: 

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.'}
Anurag Uniyal
This is great work Anurag. Thank you for coming to my aid.
Joshua
+2  A: 

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}
Pär Wieslander
Interesting use of regex. This will probably handle and adapt to more cases tan Anurag's would. Thanks for the solution.
Joshua