2010-09-14 96 views
31

Tengo un hilo grande que se divide por líneas nuevas. ¿Cómo puedo eliminar todas las líneas que están vacías (solo espacios en blanco)?Cómo eliminar líneas vacías con o sin espacio en blanco en Python

seudo código:

for stuff in largestring: 
    remove stuff that is blank 
+1

[En cuanto a mí, he encontrado la respuesta en este caso es la mejor solución] (http://stackoverflow.com/questions/1140958/whats-a-quick-one-liner-to-remove-empty-lines-from-a-python-string # answer-24172715) – Dmitriy

+0

Un liner para eliminar las líneas vacías (sin espacios en blanco) es [this] (http://stackoverflow.com/a/1140966/2373278). El título de la pregunta podría cambiarse a 'Eliminar líneas vacías con espacios en blanco solo en python'. – ViFI

Respuesta

36

Uso de expresiones regulares:

if re.match(r'^\s*$', line): 
    # line is empty (has only the following: \t\n\r and whitespace) 

Uso de expresiones regulares + filter():

filtered = filter(lambda x: not re.match(r'^\s*$', x), original) 

Como se ve en codepad.

+1

¡Gracias por todos los resultados, sin embargo, esta solución era exactamente lo que estaba buscando! Muchas gracias – user428370

+2

La solución de gimel, con volver a unir el texto después, ofrece un rendimiento mucho mejor. Comparé las dos soluciones en un texto pequeño (10 líneas si 3 estaban en blanco). Aquí están los resultados: regex: '1000 loops, mejor de 3: 452 us por loop'; join, split & strip: '100000 loops, lo mejor de 3: 5.41 us por loop' – m01

40

lista Try comprensión y string.strip():

>>> mystr = "L1\nL2\n\nL3\nL4\n \n\nL5" 
>>> mystr.split('\n') 
['L1', 'L2', '', 'L3', 'L4', ' ', '', 'L5'] 
>>> [line for line in mystr.split('\n') if line.strip() != ''] 
['L1', 'L2', 'L3', 'L4', 'L5'] 
+4

+1 para mostrar útilmente el resultado intermedio. – LarsH

+1

+1 Esto es más o menos exactamente cómo resolví este problema cuando lo tenía. – kindall

+9

puede acortarlo omitiendo! = '' Simplemente "if line.strip()" – javadba

6

Editar: Vaya, supongo que la omisión de lo obvio no está bien.

lines = bigstring.split() 
lines = [line for line in lines if line.strip()] 
+1

Eso funcionaría para lines = ['Line \ n', '\ n', 'Line \ n'] pero la entrada es 'Línea \ n \ nLínea \ n'. –

+2

@Walter: en realidad, si utilizó 'Line \ n \ nLine \ n'.split() como debería, funcionaría bien. – nmichaels

13

También probé soluciones de expresiones regulares y de lista, y lista es más rápido.

Aquí está mi solución (por respuestas anteriores):

text = "\n".join([ll.rstrip() for ll in original_text.splitlines() if ll.strip()]) 
4

Si no está dispuesto a probar expresiones regulares (que debe), puede utilizar esto:

s.replace('\n\n','\n') 

Repita esto varias veces para asegurarse de que no quede una línea en blanco. O encadenar los comandos:

s.replace('\n\n','\n').replace('\n\n','\n') 
+1

Puede usar una expresión regular, por ejemplo. "Repita varias líneas para asegurarse" no es una buena idea cuando está codificando, ya que puede dejar las cosas sin resolver o perder el tiempo ejecutando algo más veces de las necesarias. – Enrico

+0

+1 a regex, pero como un hack perezoso (o si la importación del módulo regex es demasiado lenta) puede encadenar declaraciones de sustitución: 's.replace ('\ n \ n', '\ n'). Replace (' \ n \ n ',' \ n ') ' Probado en 3.6. –

+0

@evan_b no pensó en encadenar comandos. ¿Cuál se ejecutará primero? – Ooker

1

Mi versión:

while '' in all_lines: 
    all_lines.pop(all_lines.index('')) 
-1
while True: 
    try: 
     all_lines.remove('') 
    except ValueError: 
     break 
+1

Explique cómo resuelve su código el problema –

+0

¿Qué no está claro? – Radren

0

komodo edit remove blank lines

En Komodo Edit pulse Ctrl + H estrella Marcos (Tratar como expresiones regulares), Haga clic en el enlace de arriba para ver instantánea.

0

Igual que lo que dijo @NullUserException, así es como lo escribo:

removedWhitespce = re.sub(r'^\s*$', '', line) 
Cuestiones relacionadas