multiple delimiters array python string split tokenize

delimiters - split python 3



tokenizar una cadena manteniendo delimitadores en Python (5)

¿Hay algún equivalente a str.split en Python que también devuelva los delimitadores?

Necesito preservar el diseño del espacio en blanco para mi salida después de procesar algunos de los tokens.

Ejemplo:

>>> s="/tthis is an example" >>> print s.split() [''this'', ''is'', ''an'', ''example''] >>> print what_I_want(s) [''/t'', ''this'', '' '', ''is'', '' '', ''an'', '' '', ''example'']

¡Gracias!


¿Has mirado en pyparsing? Ejemplo tomado de la wiki pyparsing :

>>> from pyparsing import Word, alphas >>> greet = Word(alphas) + "," + Word(alphas) + "!" >>> hello1 = ''Hello, World!'' >>> hello2 = ''Greetings, Earthlings!'' >>> for hello in hello1, hello2: ... print (u''%s /u2192 %r'' % (hello, greet.parseString(hello))).encode(''utf-8'') ... Hello, World! → ([''Hello'', '','', ''World'', ''!''], {}) Greetings, Earthlings! → ([''Greetings'', '','', ''Earthlings'', ''!''], {})


El módulo re proporciona esta funcionalidad:

>>> import re >>> re.split(''(/W+)'', ''Words, words, words.'') [''Words'', '', '', ''words'', '', '', ''words'', ''.'', '''']

(citado de la documentación de Python).

Para su ejemplo (dividido en espacios en blanco), use re.split(''(/s+)'', ''/tThis is an example'') .

La clave es encerrar la expresión regular en la cual se divide en paréntesis de captura. De esa manera, los delimitadores se agregan a la lista de resultados.

Edición: Como se señaló, cualquier delimitador anterior / posterior, por supuesto, también se agregará a la lista. Para evitar eso, .strip() puede usar el método .strip() en su cadena de entrada.


Gracias por señalar el módulo de re , todavía estoy intentando decidir entre eso y usar mi propia función que devuelve una secuencia ...

def split_keep_delimiters(s, delims="/t/n/r "): delim_group = s[0] in delims start = 0 for index, char in enumerate(s): if delim_group != (char in delims): delim_group ^= True yield s[start:index] start = index yield s[start:index+1]

Si tuviera tiempo los pondría a punto de referencia xD


Qué tal si

import re splitter = re.compile(r''(/s+|/S+)'') splitter.findall(s)


>>> re.compile(r''(/s+)'').split("/tthis is an example") ['''', ''/t'', ''this'', '' '', ''is'', '' '', ''an'', '' '', ''example'']