[Python-es] problema con split() cuando el caracter separador debe ser tomado literalmente

Chema Cortes pych3m4 en gmail.com
Vie Abr 6 04:59:52 CEST 2012


El día 5 de abril de 2012 17:20, Jose Caballero
<jcaballero.hep en gmail.com> escribió:

> El problema viene cuando quiero que la coma sea tomada literalmente.
> En este caso "a,b,c" tendria que convertirse, por ejemplo, en ["a,b" , "c"]
>
> Una posible solucion es 'escapear' la coma que debe ser tomada literalmente.
> "a\,b,c" -> ["a,b", "c"]
>
> Bien.
> Pero y si en el caso anterior realmente la coma es caracter separador, y la
> barra es parte del primer substring?
> Es decir, que "a\,b,c" quiero que se convierta en ["a\", "b", "c"]
>
> Tendria que escapear tambien la barra? No se convierte esto en un problema
> ciclico?

Si tenemos en cuenta que las comas literales suelen venir acompañadas
de un espacio, se podía pensar en una solución con expresiones
regulares:

import re

t=re.compile(",(?![ ])")

print t.split("a, b,c")   # >>> ['a, b', 'c']


Si se quiere complicar más, por ejemplo para que también considere las
comas decimales como "comas literales":

t=re.compile("(?<!\d),(?![ ])|(?<=\d),(?![ \d])")

t.split("suma parcial: 2,5,suma total: 12,5")

#>>> ['suma parcial: 2,5', 'suma total: 12,5']


En modo "verbose":

t=re.compile("""(?x) #activa modo verbose

#patrón 1
(?<!\d)     #La coma no va precedida por un dígito
,
(?!\s)      #...ni la sigue un espacio

|#patrón 2
(?<=\d)     #A la coma le precede un dígito
,
(?![ \d])   #...pero no le sigue ni dígitos ni espacio

""")


-- 
Hyperreals *R: http://ch3m4.org/blog
Quarks, bits y otras criaturas infinitesimales


Más información sobre la lista de distribución Python-es