[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