Separar el nombre de los apellidos en Python

Se ha tomado el ejemplo en PHP de: Eduardo Romero en  https://gist.github.com/eduardoromero/8495437 y pasado a código Python.

Esta función toma un string como argumento en el que se supone contiene la representación de un nombre ordenado de la siguiente manera:
'Primernombre Segundonombre Primerapellido Segundoapellido'

Cualquiera de los strings, separados por un espacio simple dentro de la cadena pasada como argumento, son opcionales; y se seguirá la siguiente regla:
  • Si de la cadena se extrae un solo string: Primernombre.
  • Si de la cadena se extraen 2 string: Primernombre, Primerapellido.
  • Si de la cadena se extraen 3 string: Primernombre, Primerapellido, Segundoapellido.
  • Si de la cadena se extraen 4 string o más, Primernombre + Segundonombre, Primerapellido, Segundoapellido.


#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
 
def SplitNombres( nombre ):
    u"""
    Autor original en código PHP: eduardoromero.
    https://gist.github.com/eduardoromero/8495437
    
    Separa los nombres y los apellidos y retorna una tupla de tres
    elementos (string) formateados para nombres con el primer caracter
    en mayuscula. Esto es suponiendo que en la cadena los nombres y 
    apellidos esten ordenados de la forma ideal:
 
    1- nombre o nombres.
    2- primer apellido.
    3- segundo apellido.
 
    SplitNombres( '' )
    >>> ('Nombres', 'Primer Apellido', 'Segundo Apellido')
    """
 
    # Separar el nombre completo en espacios.
    tokens = nombre.split(" ")
 
    # Lista donde se guarda las palabras del nombre.
    names = []
 
    # Palabras de apellidos y nombres compuestos.
    especial_tokens = ['da', 'de', 'di', 'do', 'del', 'la', 'las', 
    'le', 'los', 'mac', 'mc', 'van', 'von', 'y', 'i', 'san', 'santa']
 
    prev = ""
    for token in tokens:
        _token = token.lower()
 
        if _token in especial_tokens:
            prev += token + " "
 
        else:
            names.append(prev + token)
            prev = ""
 
    num_nombres = len(names)
    nombres, apellido1, apellido2 = "", "", ""
 
    # Cuando no existe nombre.
    if num_nombres == 0:
        nombres = ""
 
    # Cuando el nombre consta de un solo elemento.
    elif num_nombres == 1:
        nombres = names[0]
 
    # Cuando el nombre consta de dos elementos.
    elif num_nombres == 2:
        nombres = names[0]
        apellido1 = names[1]
 
    # Cuando el nombre consta de tres elementos.
    elif num_nombres == 3:
        nombres = names[0]
        apellido1 = names[1]
        apellido2 = names[2]
 
    # Cuando el nombre consta de más de tres elementos.
    else:
        nombres = names[0] + " " + names[1]
        apellido1 = names[2]
        apellido2 = names[3]
 
    # Establecemos las cadenas con el primer caracter en mayúscula.
    nombres = nombres.title()
    apellido1 = apellido1.title()
    apellido2 = apellido2.title()
 
    return (nombres, apellido1, apellido2)