2010-09-14 6 views
31

J'ai une grande chaîne que j'ai divisé par newlines. Comment puis-je supprimer toutes les lignes vides (espaces uniquement)?Comment faire pour supprimer les lignes vides avec ou sans espaces en Python

code pseudo:

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

[Pour moi, je trouve la réponse est la meilleure solution ici] (http://stackoverflow.com/questions/1140958/whats-a-quick-one-liner-pour-enlever-les-lignes-vides-d'-un-python-string # answer-24172715) – Dmitriy

+0

Un liner pour enlever les lignes vides (sans espace) est [this] (http://stackoverflow.com/a/1140966/2373278). Le titre de la question pourrait potentiellement être changé en 'Supprimer les lignes vides avec des espaces uniquement en python'. – ViFI

Répondre

36

utilisant l'expression rationnelle:

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

Utilisation regex + filter():

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

Comme on le voit sur codepad.

+1

Merci pour tous les résultats, cependant, cette solution était exactement ce que je cherchais! Merci beaucoup – user428370

+2

La solution de gimel, en rejoignant le texte par la suite, donne une bien meilleure performance. J'ai comparé les deux solutions sur un petit texte (10 lignes si 3 étaient vides). Voici les résultats: regex: '1000 boucles, meilleur de 3: 452 us par boucle'; joindre, diviser et dénuder: '100000 boucles, le meilleur de 3: 5,41 us par boucle' – m01

40

Essayez la compréhension de la liste et 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 pour montrer utilement le résultat intermédiaire. – LarsH

+1

+1 C'est à peu près exactement comment j'ai résolu ce problème quand je l'ai eu. – kindall

+9

vous pouvez le raccourcir en omettant le! = '' Simplement "si line.strip()" – javadba

6

Edit: Wow, je suppose que l'omission de l'évidence ne va pas bien.

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

Cela fonctionnerait pour lines = ['Line \ n', '\ n', 'Line \ n'] mais l'entrée est 'Line \ n \ nLine \ n'. –

+2

@Walter: En fait, si vous utilisiez 'Line \ n \ nLine \ n'.split() comme vous le devriez, cela fonctionnerait très bien. – nmichaels

13

J'ai aussi essayé des solutions de regexp et la liste, et liste est plus rapide.

Voici ma solution (par réponses précédentes):

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

Si vous n'êtes pas prêt à essayer regex (que vous devriez), vous pouvez utiliser ceci:

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

Répétez cette opération plusieurs fois pour s'assurer qu'il n'y a plus de ligne vide. Ou enchaînant les commandes:

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

Vous pouvez utiliser une expression régulière, par exemple. "Répétez plusieurs lignes pour être sûr" n'est pas une bonne idée lorsque vous codez, car vous pouvez laisser les choses non résolues ou perdre du temps à exécuter quelque chose de plus que nécessaire. – Enrico

+0

+1 à regex, mais en tant que hack paresseux (ou si l'importation du module regex est trop lente), vous pouvez chaîner les instructions de remplacement: 's.replace ('\ n \ n', '\ n'). Replace (' \ n \ n ',' \ n ') ' Testé le 3.6. –

+0

@evan_b n'a pas pensé aux commandes de chaînage. Lequel sera exécuté en premier? – Ooker

1

Ma version:

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

S'il vous plaît expliquer comment votre code résout le problème –

+0

Qu'est-ce qui n'est pas clair? – Radren

0

komodo edit remove blank lines

Dans modifier Komodo appuyez sur Ctrl + H étoile Mark (Traiter comme regex), Cliquez lien ci-dessus pour afficher instantané.

0

Comme ce que dit @NullUserException, voici comment je l'écris:

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