2008-11-03 31 views
19

bien, así que básicamente estoy preguntando sobre su nombre Quiero que sea una entrada en lugar de Nombre y Apellido.Dividir el nombre de una persona en el nombre y el apellido

¿Hay alguna forma de dividir este nombre? y tomando solo la última palabra de la "Oración", p.

name = "Thomas Winter" 
print name.split() 

y cuál sería la salida es "invierno"

Respuesta

1

De esta manera:

print name.split()[-1] 
+0

de impresión name.split () [- 1] fíjate en() – Jake

+0

Disculpa. Estoy un poco dañado por Ruby. – JesperE

0

que probablemente desee utilizar para este rsplit:

rsplit ([sep [, maxsplit]])

Devuelve una lista de las palabras en la cadena, utilizando sep como cadena del delimitador. Si se da maxsplit, como máximo se hacen divisiones Maxsplit, las más a la derecha. Si no se especifica sep o None, cualquier cadena de espacio en blanco es un separador. A excepción de la división desde la derecha, rsplit() se comporta como split(), que se describe en detalle a continuación. Nuevo en la versión 2.4.

14

El problema al tratar de dividir los nombres de una sola entrada es que no obtendrá el apellido completo para las personas con espacios en sus apellidos, y no creo que pueda escribir código para administrar eso por completo

Le recomendaría que pida los nombres por separado si es posible.

+0

De acuerdo, ¿qué le parece, Mike St. James, por ejemplo? Un apellido incorrecto sería devuelto. – Fry

+0

Anne Marie van Guido. ¿Dónde se detiene el primer nombre y el apellido? ¡La Humanidad! –

+0

Sin mencionar las culturas donde el apellido se da primero. Pedir el nombre de una vez está bien solo siempre que siempre lo trate como una sola unidad. Intentar dividirlo generalmente dará como resultado la destrucción de algunos casos. – Brian

2

La división de nombres es más difícil de lo que parece. Algunos nombres tienen dos apellidos; algunas personas ingresarán un primer, segundo y último nombre; algunos nombres tienen dos nombres de trabajo. La forma más confiable (o menos confiable) de manejar nombres es capturar siempre el nombre y el apellido en campos separados. Por supuesto, esto plantea sus propios problemas, como la forma de manejar personas con un solo nombre, asegurándose de que funcione para los usuarios que tienen un pedido diferente de partes de nombre.

Los nombres son difíciles de manejar con cuidado.

59

Encontrará que su problema clave con este enfoque no es técnico, sino humano: diferentes personas escriben sus nombres de diferentes maneras.

De hecho, la terminología de "nombre de pila" y "apellido" es en sí misma defectuosa.

Mientras que muchas familias combinadas usan un apellido con guiones, como Smith-Jones, hay algunos que usan ambos nombres por separado, "Smith Jones", donde ambos nombres son el apellido.

Muchos apellidos europeos tienen varias partes, como "de Vere" y "van den Neiulaar". A veces estos extras tienen antecedentes familiares importantes, por ejemplo, un prefijo otorgado por un rey hace cientos de años.

Problema secundario: las he puesto en mayúscula correctamente para las personas a las que me refiero: "de" y "van den" no reciben letras para algunas familias, pero sí para otras.

Por el contrario, muchas culturas asiáticas ponen el apellido primero, porque la familia se considera más importante que el individuo.

Último punto: algunas personas le dan mucha importancia a ser "Junior" o "Senior" o "III", y su código no debe tratarlas como su apellido.

también señalar que hay un buen número de personas que utilizan un nombre que no es el otorgado por sus padres, he utilizado el siguiente esquema con cierto éxito:

Nombre completo (como se escribe normalmente para direccionar el correo); Apellido de la familia; Conocido como (el nombre comúnmente utilizado en la conversación).

por ejemplo:

Nombre completo: William Gates III; Nombre de la familia: Gates; Conocido como: Bill

Nombre completo: Soong Li; Apellido de la familia: Soong; Conocido como: Lisa

+1

+1. Para las aplicaciones, normalmente tengo un campo de "nombre completo" y "sobrenombre", que se completan de forma independiente. No he tenido un caso de uso para "apellido", pero YMMV. – erickson

+2

+1 - POR FAVOR, no se olvide de aquellos de nosotros bendecidos por nuestros padres para usar un nombre que no sea nuestro Nombre - Como 'J. Edgar Hoover '. Nombre legal (y CC, la mayoría de las veces) requiere 'J. Edgar Hoover '; Casual/Apodo/Conocido-Como sería 'Edgar Hoover'. Nombre, MI, Apellido no lo corte. –

+2

Y algunas personas no tienen un "apellido" o un "apellido", p. Ej. en algunas culturas del este de África, usan el nombre del padre y el nombre del abuelo, p. Tom Dick Harry. En algunos casos, los apellidos se encuentran en el medio, p. Anson Maria Elizabeth Chan Fong En-cantó. Ver también los artículos de Wikipedia "Nombre islandés", "Nombre árabe" y "Nombres en el Imperio ruso, la Unión Soviética y los países de la CEI". –

0

Especifico un formato estándar (algunos formularios los usan), como "Escriba su nombre en Nombre, Apellido formulario".

Lo hace más fácil para usted, ya que los nombres no suelen contener una coma. También verifica que tus usuarios ingresen tanto el nombre como el apellido.

5

Regla de oro de datos: no agregues demasiado pronto: es mucho más fácil pegar los campos juntos que separarlos. La mayoría de las personas también tienen un segundo nombre que debería ser un campo opcional. Algunas personas tienen una plétora de segundos nombres. Algunas personas solo tienen one name, una palabra. Algunas culturas comúnmente tienen un diccionario de segundo nombre, que rinde homenaje al árbol genealógico de regreso al Golgafrincham Ark landing.

Aquí no necesita una solución de código; necesita una regla de negocio.

4

Una manera fácil de hacer exactamente lo que usted pidió en Python es

name = "Thomas Winter" 
LastName = name.split()[1] 

(tenga en cuenta las parantheses en la división llamada a la función.)

split() crea una lista donde cada elemento es de su cadena original, delimitada por espacios en blanco. Ahora puedes tomar el segundo elemento usando name.split() [1] o el último elemento usando name.split() [- 1]

Sin embargo, como otros dijeron, a menos que estés SEGURO de que solo estás obteniendo una cadena como "First_Name Last_Name", hay muchos más problemas involucrados.

2

Dado que hay tantas variaciones diferentes de cómo las personas escriben sus nombres, esta es una forma básica de obtener el nombre/apellido a través de expresiones regulares.

import re 
p = re.compile(r'^(\s+)?(Mr(\.)?|Mrs(\.)?)?(?P<FIRST_NAME>.+)(\s+)(?P<LAST_NAME>.+)$', re.IGNORECASE) 
m = p.match('Mr. Dingo Bat') 
if(m != None): 
    first_name = m.group('FIRST_NAME') 
    last_name = m.group('LAST_NAME') 
9

Este es un problema bastante antiguo, pero lo encontré buscando una solución para analizar piezas de un nombre englobado.

http://code.google.com/p/python-nameparser/

+2

Está muy centrado en los EE. UU. (Por ejemplo, los títulos parecen abarcar casi todos los rangos de las fuerzas armadas de EE. UU.) Y el código de capitalización produce las tonterías habituales como MacE y MacK y MacHin :-( –

+0

Creo que esta es una gran biblioteca de Python tiene una oportunidad completa de lidiar con todos los problemas @bevan enumerados en su publicación. Otorgué los comentarios de JohnMachin sobre que está centrado en EE. UU., sin embargo, eso está bien para mi caso de uso. Empecé a escribir una versión más simple de python-nameparser, antes de leer su publicación Gracias. – dlink

1

Es, definitivamente, una tarea más complicada de lo que parece en la superficie. Escribí algunos de los desafíos, así como mi algoritmo para resolverlo en mi blog.Asegúrese de revisar mi proyecto de Google Code para que si desea que la última versión de PHP:

http://www.onlineaspect.com/2009/08/17/splitting-names/

4

Así es como lo hago en mi solicitud:

def get_first_name(fullname): 
    firstname = '' 
    try: 
     firstname = fullname.split()[0] 
    except Exception as e: 
     print str(e) 
    return firstname 

def get_last_name(fullname): 
    lastname = '' 
    try: 
     index=0 
     for part in fullname.split(): 
      if index > 0: 
       if index > 1: 
        lastname += ' ' 
       lastname += part 
      index += 1 
    except Exception as e: 
      print str(e) 
    return lastname 

def get_last_word(string): 
    return string.split()[-1] 

print get_first_name('Jim Van Loon') 
print get_last_name('Jim Van Loon') 
print get_last_word('Jim Van Loon') 
+0

Hola. Gracias por el código. Observación: podría eliminarse la necesidad de establecer un índice con enumerar - para índice, parte en enumerar (fullname.split()). También puede eliminar la necesidad del condicional alrededor de + = '', al usar join. lastname = '' .join (apellidos) – dlink

+0

'return" ".join (fullname.split() [1:])' en lugar de todo en 'try ... except'. –

Cuestiones relacionadas