nuevo "programando"

Arnau Sanchez arnau en ehas.org
Jue Jul 12 15:35:01 CEST 2007


Arnau Sanchez escribió:

>> 300. Empiezan por la palabra "     frecuencia" con espacios. Lo que 

Por aclarar: lo que acabo de mandar no tienen en cuenta el número de espacios o 
tabuladores que preceden a la palabra "frecuencia" en inicio de línea. Si 
realmente quieres que empiece por 5 espacios, ni más ni menos, cambiarías:

line.lstrip().startswith("frecuencia")
por
line.startswith("     frecuencia")
o
line.startswith(" "*5+"frecuencia")
o
line.find("frecuencia") == 5

y
"^(\s*frecuencia.*)$"
por
"^(     frecuencia.*)$"
o
"^( {5}frecuencia.*)$"

> Esta es una duda bastante típica, así que tenía su entrada en el FAQ que 
> acabamos de crear. Aprovechando tu pregunta, la he completado con el 
> problema que planteas:
> 
> http://pythonesfaq.k-rolus.net/#index21h3
> 
> La solución que usa expresiones regulares no me acaba de gustar, seguro 
> que a alguien se le ocurre alguna forma mejor.
> 
> 1ª propuesta: usando métodos de cadena.
> 
>     output = file("salida.txt", "w")
>     for line in file("entrada.txt"):
>         if line.lstrip().startswith("frecuencia"):
>             output.write(line)
>     output.close()
> 
> 2ª propuesta: usando métodos de cadena y el método *writelines* con 
> generadores.
> 
>     output = file("salida.txt", "w")
>     condition = lambda s: s.lstrip().startswith("frecuencia")
>     output.writelines(line for line in file("entrada.txt") if 
> condition(line))
>     output.close()
> 
> 3ª propuesta: usando métodos de cadena, y leyendo/escribiendo en una 
> misma línea con generadores (poco claro).
> 
>     condition = lambda s: s.lstrip().startswith("frecuencia")
>     file("salida.txt", "w").writelines(line for line in 
> file("entrada.txt") if condition(line))
> 
> 4ª propuesta: usando expresiones regulares. En este caso tan simple no 
> está justificado, pero a veces la búsqueda puede ser más compleja y 
> entonces sí puede ser útil.
> 
>     import re
>     output = file("salida.txt", "w")
>     pat = re.compile("^(\s*frecuencia.*)$", re.MULTILINE)
>     addlf = lambda iterator: ("%s\n"%s for s in iterator)
>     output.writelines(addlf(pat.findall(file("entrada.txt").read())))
>     output.close()
> 
> _______________________________________________
> Python-es mailing list
> Python-es en aditel.org
> http://listas.aditel.org/listinfo/python-es
> 
> 




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