Python: ¿Cómo puedo incluir los delimitadores en una división de cadena?

Me gustaría dividir una cadena, con múltiples delimitadores, pero mantener los delimitadores en la lista resultante. Creo que esto es algo útil para hacer un primer paso para analizar cualquier tipo de fórmula, y sospecho que existe una buena solución de Python.

Alguien hizo una pregunta similar en Java aquí .

Por ejemplo, una división típica se ve así:

>>> s='(twoplusthree)plusfour' >>> s.split(f, 'plus') ['(two', 'three)', 'four'] 

Pero estoy buscando una buena forma de agregar el signo positivo (o retenerlo):

 ['(two', 'plus', 'three)', 'plus', 'four'] 

En última instancia, me gustaría hacer esto para cada operador y soporte, así que si hay una manera de obtener

 ['(', 'two', 'plus', 'three', ')', 'plus', 'four'] 

todo de una vez, entonces todo lo mejor.

Puedes hacer eso con el módulo de re de Python.

 import re s='(twoplusthree)plusfour' list(filter(None, re.split(r"(plus|[()])", s))) 

Puede omitir la lista si solo necesita un iterador.

 import re s = '(twoplusthree)plusfour' l = re.split(r"(plus|\(|\))", s) a = [x for x in l if x != ''] print a 

salida:

 ['(', 'two', 'plus', 'three', ')', 'plus', 'four'] 

Aquí es una manera fácil de usar re.split :

 import re s = '(twoplusthree)plusfour' re.split('(plus)', s) 

Salida:

 ['(two', 'plus', 'three)', 'plus', 'four'] 

re.split es muy similar a string.split excepto que en lugar de un delimitador literal, se pasa un patrón de expresiones regulares. El truco aquí es poner () alrededor del patrón para que se extraiga como grupo.

Tenga en cuenta que tendrá cadenas vacías si hay dos ocurrencias consecutivas del patrón delimitador

Este hilo es antiguo, pero desde su resultado de Google superior pensé en agregar esto:

Si no desea utilizar expresiones regulares, hay una forma más sencilla de hacerlo. básicamente solo se llama dividir, pero vuelve a colocar el separador excepto en el último token

 def split_keep_deli(string_to_split, deli): result_list = [] tokens = string_to_split.split(deli) for i in xrange(len(tokens) - 1): result_list.append(tokens[i] + deli) result_list.append(tokens[len(tokens)-1]) return result_list 

Aquí estoy dividiendo una cadena en la primera aparición de caracteres alfa:

 def split_on_first_alpha(i): #i="3.5 This is one of the way" split_1=re.split(r'[az]',i,maxsplit=1, flags=re.IGNORECASE) find_starting=re.findall(r'[az]',i,flags=re.IGNORECASE) split_1[1]=find_starting[0]+split_1[1] return split_1