Python: división por cierto patrón

Tengo los siguientes

str = '[5.955894, 45.817792], [10.49238, 45.817792], [10.49238, 47.808381], [5.955894, 47.808381]' 

Quiero dividirlo para que tenga una serie de cadenas como

['[5.955894, 45.817792]', '[10.49238, 45.817792]', ...]

De modo que los […] objetos son elementos de la matriz. Es importante que se incluyan los anexos [y]. He llegado hasta aquí:

 re.split('\D,\s\D', str) 

Pero eso me da:

 ['[5.955894, 45.817792', '10.49238, 45.817792', '10.49238, 47.808381', '5.955894, 47.808381]'] 

Realmente no es lo que quiero.

Prefiero usar re.findall y especificar lo que quiero en lugar de tratar de describir el delimitador para re.split

 >>> s = '[5.955894, 45.817792], [10.49238, 45.817792], [10.49238, 47.808381], [5.955894, 47.808381]' >>> re.findall(r"\[[^\]]*\]",s) ['[5.955894, 45.817792]', '[10.49238, 45.817792]', '[10.49238, 47.808381]', '[5.955894, 47.808381]'] 
  1. \[ coincidencias [
  2. [^\]]* coincide con cualquier cosa menos]
  3. \] coincidencias]

Necesitas usar re.split con look-ahead :

 >>> s = '[5.955894, 45.817792], [10.49238, 45.817792], [10.49238, 47.808381], [5.955894, 47.808381]' >>> re.split(",[ ]*(?=\[)", s) ['[5.955894, 45.817792]', '[10.49238, 45.817792]', '[10.49238, 47.808381]', '[5.955894, 47.808381]'] 

Y no uses str como variable. Es sombras las incorporadas.

El siguiente patrón:

 ,[ ]*(?=\[) 

coincidirá con la comma(,) y algunos espacios en blanco, que es seguido por un [

Incluso puedes hacerlo look-behind . Entonces, (?<=\]),[ ]* También funcionará.

Aquí hay un procedimiento ingenuo que he escrito, creo que resuelve tu problema pero no puede ser el mejor.

 >>>def split_string(strg, begin = '[', end = ']'): myList = [] string = '' for char in strg: if char == begin: string = '' string += char if char == end: myList.append(string) return myList >>>strg = '[5.955894, 45.817792], [10.49238, 45.817792], [10.49238, 47.808381], [5.955894, 47.808381]' >>>split_string(strg) ['[5.955894, 45.817792]', '[10.49238, 45.817792]', '[10.49238, 47.808381]', '[5.955894, 47.808381]'] 

A partir de @nhahtdh comentario.

Depende de tus problemas de confianza.

 In [510]: txt = '[5.955894, 45.817792], [10.49238, 45.817792], [10.49238, 47.808381], [5.955894, 47.808381]' In [511]: lst = eval ("[%s]" % txt) In [512]: [str(x) for x in lst] Out[512]: ['[5.955894, 45.817792]', '[10.49238, 45.817792]', '[10.49238, 47.808381]', '[5.955894, 47.808381]']