sub - re.search python examples
Problema simple de Python/Regex: Eliminar todas las lĂneas nuevas de un archivo (5)
Me estoy familiarizando con python y estoy creando problemas para ayudarme a aprender los entresijos del lenguaje. Mi siguiente problema es el siguiente:
He copiado y pegado una gran cantidad de texto de Internet, pero copiar y pegar agregó varias líneas nuevas para romper la enorme cadena. Deseo eliminar todos estos de manera programática y devolver la cadena a una masa gigante de caracteres. Obviamente, este es un trabajo para expresiones regulares (creo), y el análisis del archivo y la eliminación de todas las instancias del carácter de nueva línea suena como si funcionara, pero no parece que se esté revisando tan bien para mí.
¿Hay una manera fácil de hacer esto? Parece bastante simple.
Las dos alternativas principales: leer todo en una sola cadena y eliminar nuevas líneas:
clean = open(''thefile.txt'').read().replace(''/n'', '''')
o, lea línea por línea, elimine la nueva línea que termina cada línea y vuelva a unirla:
clean = ''''.join(l[:-1] for l in open(''thefile.txt''))
La primera alternativa es probablemente más rápida, pero, como siempre, le recomiendo encarecidamente la MEDIDA (p. Ej., python -mtimeit
) en casos de su interés específico, en lugar de simplemente suponer que sabe cómo será el rendimiento. Los RE son probablemente más lentos, pero, una vez más: no adivine, ¡MIDA!
Así que aquí hay algunos números para un archivo de texto específico en mi computadora portátil:
$ python -mtimeit -s"import re" "re.sub(''/n'','''',open(''AV1611Bible.txt'').read())"
10 loops, best of 3: 53.9 msec per loop
$ python -mtimeit "''''.join(l[:-1] for l in open(''AV1611Bible.txt''))"
10 loops, best of 3: 51.3 msec per loop
$ python -mtimeit "open(''AV1611Bible.txt'').read().replace(''/n'', '''')"
10 loops, best of 3: 35.1 msec per loop
El archivo es una versión de la Biblia KJ, descargada y descomprimida desde here (creo que es importante ejecutar tales mediciones en un archivo fácil de recuperar, ¡para que otros puedan reproducirlas fácilmente!).
Por supuesto, unos pocos milisegundos más o menos en un archivo de 4.3 MB, 34,000 líneas, pueden no importarle mucho de una forma u otra; pero como el enfoque más rápido es también el más simple (lejos de ser algo inusual, especialmente en Python ;-), creo que es una buena recomendación.
No usaría una expresión regular para reemplazar simplemente las nuevas líneas, usaría string.replace()
. Aquí hay un guión completo:
f = open(''input.txt'')
contents = f.read()
f.close()
new_contents = contents.replace(''/n'', '''')
f = open(''output.txt'', ''w'')
f.write(new_contents)
f.close()
Pregunta antigua, pero como estaba en mis resultados de búsqueda para una consulta similar, y nadie ha mencionado las funciones de cadena de python strip() || lstrip() || rstrip()
strip() || lstrip() || rstrip()
strip() || lstrip() || rstrip()
, solo añadiré eso para la posteridad (y cualquiera que prefiera no usar re cuando no sea necesario):
old = open(''infile.txt'')
new = open(''outfile.txt'', ''w'')
stripped = [line.strip() for line in old]
old.close()
new.write("".join(stripped))
new.close()
Sé que este es un problema de aprendizaje de Python, pero si alguna vez intentas hacer esto desde la línea de comandos, no es necesario escribir un script de Python. Aquí hay un par de otras maneras:
cat $FILE | tr -d ''/n''
awk ''{printf("%s", $0)}'' $FILE
Ninguno de estos tiene que leer todo el archivo en la memoria, por lo que si tiene que procesar un archivo enorme, es posible que sean mejores que las soluciones de python provistas.
import re
re.sub("/n", "", file-contents-here)