2009-08-08 3 views
4

Existe-t-il une fonction de bibliothèque multiplate-forme qui réduirait une chaîne multiligne en une chaîne à ligne unique sans espaces récurrents?Existe-t-il une fonction de bibliothèque de réduction de chaîne en python?

J'ai trouvé un snip ci-dessous, mais je me demande s'il y a une fonction standard que je pourrais simplement importer, qui est peut-être même optimisée en C?

def collapse(input): 
    import re 
    rn = re.compile(r'(\r\n)+') 
    r = re.compile(r'\r+') 
    n = re.compile(r'\n+') 
    s = re.compile(r'\ +') 
    return s.sub(' ',n.sub(' ',r.sub(' ',rn.sub(' ',input)))) 

P.S. Merci pour les bonnes observations. ' '.join(input.split()) semble être le gagnant car il tourne plus vite environ deux fois dans mon cas par rapport à search-replace avec une regex r'\s+' précompilé.

+1

Pourquoi "cross-platform" dans le titre de la question? Presque tout en Python est multiplate-forme, à l'exception des éléments spécifiques au système d'exploitation. Ce n'est clairement pas spécifique au système d'exploitation, sauf si vous avez omis quelque chose. –

+0

bon point. Je ne savais pas que le caractère '\ n' est multi-plateforme en python. Je pensais que '\ n' signifie littéralement un caractère ascii spécial. – Evgeny

+0

Cela signifie littéralement un caractère ascii spécial. Ce personnage est le même sur toutes les plateformes - une nouvelle ligne. –

Répondre

12

La méthode intégrée string.split() découpera sur les pistes de blancs, de sorte que vous pouvez l'utiliser, puis se joindre à la liste résultante en utilisant des espaces, comme ceci:

' '.join(my_string.split()) 

Voici un script de test complet:

TEST = """This 
is  a test\twith a 
    mix of\ttabs,  newlines and repeating 
whitespace""" 

print ' '.join(TEST.split()) 
# Prints: 
# This is a test with a mix of tabs, newlines and repeating whitespace 
0
multi_line.replace('\n', '') 

fera le travail. '\n' est un caractère de fin de ligne universel en python.

+1

merci. bon à savoir. mais cela ne fonctionnera pas bien puisqu'il n'insèrera pas d'espace vide là où c'est nécessaire et ne supprimera pas les espaces vides répétitifs – Evgeny

+0

Je ne suis pas sûr de ce que @Evgeny veut dire par "espace vide" mais de toute façon la solution proposée ne répond pas Exigence "sans espaces répétitifs" de l'OP. –

4

vous avez eu la bonne idée, vous juste besoin de lire le manuel python un peu plus près:

import re 
somewhitespace = re.compile(r'\s+') 
TEST = """This 
is  a test\twith a 
    mix of\ttabs,  newlines and repeating 
whitespace""" 

somewhitespace.sub(' ', TEST) 

'This is a test with a mix of tabs, newlines and repeating whitespace' 
Questions connexes