Supprimer tous les sauts de ligne d'une longue chaîne de texte

128

Fondamentalement, je demande à l'utilisateur de saisir une chaîne de texte dans la console, mais la chaîne est très longue et comprend de nombreux sauts de ligne. Comment puis-je prendre la chaîne de l'utilisateur et supprimer tous les sauts de ligne pour en faire une seule ligne de texte. Ma méthode pour acquérir la chaîne est très simple.

string = raw_input("Please enter string: ")

Existe-t-il une manière différente de saisir la chaîne de l'utilisateur? J'exécute Python 2.7.4 sur un Mac.

PS Je suis clairement un noob, donc même si une solution n'est pas la plus efficace, celle qui utilise la syntaxe la plus simple serait appréciée.

Ian Zane
la source
4
@NicYoung, c'est similaire mais différent. stripsupprime les espaces au début et à la fin d'une chaîne, pas à l' intérieur de la chaîne ...
Daren Thomas

Réponses:

215

Comment saisissez-vous les sauts de ligne avec raw_input? Mais, une fois que vous avez une chaîne avec des caractères dont vous voulez vous débarrasser, juste replaceeux.

>>> mystr = raw_input('please enter string: ')
please enter string: hello world, how do i enter line breaks?
>>> # pressing enter didn't work...
...
>>> mystr
'hello world, how do i enter line breaks?'
>>> mystr.replace(' ', '')
'helloworld,howdoienterlinebreaks?'
>>>

Dans l'exemple ci-dessus, j'ai remplacé tous les espaces. La chaîne '\n'représente les nouvelles lignes. Et \rreprésente les retours chariot (si vous êtes sur Windows, vous pourriez les obtenir et une seconde replaceles gérera pour vous!).

fondamentalement:

# you probably want to use a space ' ' to replace `\n`
mystring = mystring.replace('\n', ' ').replace('\r', '')

Notez également que c'est une mauvaise idée d'appeler votre variable string, car cela fait de l'ombre au module string. Un autre nom il faut éviter , mais aimerais parfois utiliser: file. Pour la même raison.

Daren Thomas
la source
A parfaitement fonctionné, désolé pour la question stupide! Ma solution initiale était de lister la chaîne et de rechercher toutes les instances de \ n, mais comme la liste ne contenait qu'un seul caractère par entrée de liste, la recherche retournait toujours false car elle trouverait soit \ ou n mais pas les deux dans la même liste entrée.
Ian Zane
4
Cette réponse m'est très utile car elle mentionne les \rretours chariot. J'ai essayé toutes les méthodes pour supprimer \nmais je n'ai toujours pas capturé les \rpersonnages.
Clay
1
Cela fait généralement le travail pour moi - string.replace ('\ r \ n', '')). La plupart des fichiers journaux / éditeurs de texte ont tendance à suivre ce format pour les nouvelles lignes.
Quest Monger
1
Vous indiquez que vous n'utilisez pas le nom de la variable string, mais pour une raison similaire, vous ne souhaitez pas utiliser le nom de la variable str.
tscizzle du
2
@information_interchange Cette approche fonctionne sur les fichiers Linux qui ont \nmais pas \r\n.
Noumenon
45

Vous pouvez essayer d'utiliser le remplacement de chaîne:

string = string.replace('\r', '').replace('\n', '')
Konstantin Dinev
la source
J'ai eu un problème avec certains textes. J'ai essayé d'utiliser rstrip (), mais cela n'a pas fonctionné. J'utilise replace ().
Bruno Gomes
25

Vous pouvez diviser la chaîne sans séparateur arg, ce qui traitera les espaces blancs consécutifs comme un seul séparateur (y compris les nouvelles lignes et les tabulations). Puis rejoignez en utilisant un espace:

In : " ".join("\n\nsome    text \r\n with multiple whitespace".split())
Out: 'some text with multiple whitespace'

https://docs.python.org/2/library/stdtypes.html#str.split

Sean
la source
Très belle idée, car normaliser aussi les tabulations, les doubles espaces et ainsi de suite +1
daitangio
15

mis à jour en fonction du Xbellocommentaire:

string = my_string.rstrip('\r\n')

en savoir plus ici

tokhi
la source
3
Je viens d'être mordu par ça. Si vous spécifiez \ n à rstrip, \ r échoue. Si vous ne spécifiez rien, les espaces, \ t et éventuellement d'autres sont supprimés. Vous devez utiliserrstrip("\r\n")
xbello
1
avait une chaîne où tout simplement rstrip('\r\n')n'était pas suffisant et devait aller avec:my_string.rstrip('\r\n').replace('\n', ' ')
MMT
8

Une autre option est regex:

>>> import re
>>> re.sub("\n|\r", "", "Foo\n\rbar\n\rbaz\n\r")
'Foobarbaz'
Neil
la source
plus d'informations sur la façon de faire correspondre les sauts de ligne consécutifs serait bien r'[\n\r]+'ou même r'\s+'de remplacer n'importe quel espace blanc par un seul espace.
Risadinha le
3

Une méthode prenant en compte

  • caractères blancs supplémentaires au début / à la fin de la chaîne
  • caractères blancs supplémentaires au début / à la fin de chaque ligne
  • divers caractères de fin de ligne

il prend une telle chaîne multi-lignes qui peut être désordonnée par exemple

test_str = '\nhej ho \n aaa\r\n   a\n '

et produit une belle chaîne d'une ligne

>>> ' '.join([line.strip() for line in test_str.strip().splitlines()])
'hej ho aaa a'

MISE À JOUR: Pour corriger plusieurs caractères de nouvelle ligne produisant des espaces redondants:

' '.join([line.strip() for line in test_str.strip().splitlines() if line.strip()])

Cela fonctionne aussi pour les éléments suivants test_str = '\nhej ho \n aaa\r\n\n\n\n\n a\n '

Kamil Neczaj
la source
Cela ne gère pas le cas des sauts de ligne contigus au milieu de la chaîne. Deux sauts de ligne se traduisent par deux espaces contigus dans la sortie. Essayez "test_str = '\ nhej ho \ n aaa \ r \ n \ na \ n'"
Mike Gleen
2

Si quelqu'un décide d'utiliser replace, vous devriez essayer à la r'\n'place'\n'

mystring = mystring.replace(r'\n', ' ').replace(r'\r', '')
Anar Salimkhanov
la source
Pourquoi? Je me souviens vaguement pourquoi c'est une bonne idée, mais nous devons la documenter.
Martin Burch le
1
Dans mon cas, je devais faire ceci: 1. Obtenir le code HTML de la base de données 2. Obtenir le texte requis à partir de HTML 3. Supprimer tous les sauts de ligne du texte 4. Insérer le texte édité dans une feuille de calcul Et cela ne fonctionnait pas correctement, sauf si je utilisé r("littéral de chaîne brute"). Malheureusement, je ne sais pas pourquoi)
Anar Salimkhanov
1

Le problème avec rstrip est qu'il ne fonctionne pas dans tous les cas (comme j'en ai moi-même vu peu). A la place, vous pouvez utiliser - text = text.replace ("\ n", "") cela supprimera toute nouvelle ligne \ n avec un espace.

Merci d'avance les gars pour vos votes positifs.

Ankit Dwivedi
la source