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'']