[Python-es] Tratamiento de datos.

José Sabater Montes jsm en iaa.es
Jue Jun 5 19:36:06 CEST 2014


Hola,

El 05/06/2014, a las 18:08, Jose M.Allegue <jmallegue en gmail.com> escribió:

> No entiendo esta linea de código:
> alt = re.findall("(?<= )(\d{1,2}) (\d{1,2}\.\d{1,2}) ([NS]),\s+(\d{1,2}) (\d{1,2}\.\d{1,2}) ([EW]).*", line) 

Jeje, es la expresión regular (https://es.wikipedia.org/wiki/Expresi%C3%B3n_regular). Son un pequeño mundo en sí mismas pero pueden ser muy potentes en estos casos. 
Lo que hace es introducir en “alt" una lista (o varias) con los valores que extrae de la línea “line” que se ajustan a las reglas de la expresión regular indicada. La expresión regular en sí es la cadena "(?<= )(\d{1,2}) (\d{1,2}\.\d{1,2}) ([NS]),\s+(\d{1,2}) (\d{1,2}\.\d{1,2}) ([EW]).*”. Quiero mencionar que hay otras alternativas que podrían funcionar e incluso adaptarse mejor pero esta es la que se me ha ocurrido.

Si la miramos por partes:
 * "(?<= )" esto indica que lo que viene detrás empezaría con un carácter en blanco.
 * "(\d{1,2})" esto extrae uno o dos dígitos como primer elemento de la lista.
 * " (\d{1,2}\.\d{1,2})" después de un espacio en blanco extrae uno o dos dígitos seguidos de un punto y uno o dos dígitos más.
 * " ([NS])" después de otro espacio extrae un carácter “N" o “S”.
 * ",\s+(\d{1,2})" después de una coma y un número indeterminado de espacios extrae uno o dos dígitos.
 * " (\d{1,2}\.\d{1,2})" de nuevo se extrae una combinación como la de antes.
 * " ([EW])"  después de un espacio extrae un carácter “E" o “W”.
 * “.*"  el resto de la cadena puede ser cualquier cosa.
Al final tienes en alt una lista de listas de 6 elementos. En tu caso alt solo tiene un elemento, ya que solo encuentra el patrón para las coordenadas una vez como mucho en cada línea. Este elemento se compone de los grados de latitud, minutos decimales de latitud, N o S, grados de longitud, minutos decimales de longitud y E o W.

Un saludo.



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