Eliminar todos los saltos de línea de una larga cadena de texto

128

Básicamente, le pido al usuario que ingrese una cadena de texto en la consola, pero la cadena es muy larga e incluye muchos saltos de línea. ¿Cómo tomaría la cadena del usuario y eliminaría todos los saltos de línea para convertirla en una sola línea de texto? Mi método para adquirir la cadena es muy simple.

string = raw_input("Please enter string: ")

¿Hay una forma diferente en que debería estar agarrando la cadena del usuario? Estoy ejecutando Python 2.7.4 en una Mac.

PD: Claramente soy un novato, por lo que incluso si una solución no es la más eficiente, agradecería la que usa la sintaxis más simple.

Ian Zane
fuente
44
@NicYoung, eso es similar pero diferente. stripelimina los espacios en blanco al comienzo y al final de una cadena, no dentro de la cadena ...
Daren Thomas

Respuestas:

214

¿Cómo se ingresan los saltos de línea raw_input? Pero, una vez que tiene una cadena con algunos caracteres, desea eliminarlos, solo replaceellos.

>>> 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?'
>>>

En el ejemplo anterior, reemplacé todos los espacios. La cadena '\n'representa nuevas líneas. Y \rrepresenta los retornos de carro (si estás en Windows, ¡podrías estar recibiendo estos y un segundo replacelos manejará por ti!).

básicamente:

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

Tenga en cuenta también que es una mala idea llamar a su variable string, ya que esto sombrea el módulo string. Otro nombre pero yo evitaría gustaría utilizar a veces: file. Por la misma razón.

Daren Thomas
fuente
Funcionó perfectamente, perdón por la estúpida pregunta! Mi solución inicial fue enumerar la cadena y buscar todas las instancias de \ n, pero debido a que la lista tenía solo 1 carácter por entrada de lista, la búsqueda seguía devolviendo false porque encontraría \ or n pero no ambos en la misma lista entrada.
Ian Zane
44
Esta respuesta es muy útil para mí porque menciona los \rretornos de carro. He intentado eliminar todos los métodos, \npero todavía no estaba capturando a los \rpersonajes.
Clay
1
Esto generalmente hace el trabajo por mí: string.replace ('\ r \ n', '')). La mayoría de los archivos de registro / editor de texto tienden a seguir este formato para nuevas líneas.
Quest Monger
1
Señala que no usa el nombre de la variable string, pero por una razón similar no desea usar el nombre de la variable str.
tscizzle
2
@information_interchange Este enfoque funciona en archivos Linux que tienen \npero no tienen \r\n.
Noumenon
45

Puedes intentar usar string replace:

string = string.replace('\r', '').replace('\n', '')
Konstantin Dinev
fuente
Tuve un problema con algunos textos. Traté de usar rstrip (), pero no funcionó. Yo uso replace ().
Bruno Gomes
25

Puede dividir la cadena sin argumento de separación, que tratará los espacios en blanco consecutivos como un separador único (incluidas las nuevas líneas y pestañas). Luego únete usando un espacio:

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
fuente
Muy buena idea, porque normalizar también pestañas, espacios dobles y así sucesivamente +1
daitangio
15

actualizado basado en el Xbellocomentario:

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

lea más aquí

tokhi
fuente
3
He sido mordido por esto. Si especifica \ n para rstrip, \ r falla. Si no especifica nada, se recortan espacios, \ t y posiblemente otros. Tienes que usarrstrip("\r\n")
xbello
1
tenía una cadena donde simplemente rstrip('\r\n')no era suficiente y tenía que ir con:my_string.rstrip('\r\n').replace('\n', ' ')
MMT
8

Otra opción es regex:

>>> import re
>>> re.sub("\n|\r", "", "Foo\n\rbar\n\rbaz\n\r")
'Foobarbaz'
Neil
fuente
Sería bueno tener más información sobre cómo hacer coincidir los saltos de línea consecutivos r'[\n\r]+'o incluso r'\s+'reemplazar cualquier espacio en blanco con un solo espacio.
Risadinha
3

Un método que tiene en cuenta

  • caracteres blancos adicionales al principio / al final de la cadena
  • caracteres blancos adicionales al comienzo / final de cada línea
  • varios personajes finales

se necesita una cadena de varias líneas que puede ser desordenada, por ejemplo

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

y produce una buena cadena de una línea

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

ACTUALIZACIÓN: Para corregir múltiples caracteres de nueva línea que producen espacios redundantes:

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

Esto también funciona para lo siguiente test_str = '\nhej ho \n aaa\r\n\n\n\n\n a\n '

Kamil Neczaj
fuente
Esto no maneja el caso de los avances de línea contigua en el medio de la cadena. Dos avances de línea dan como resultado dos espacios en blanco contiguos en la salida. Pruebe "test_str = '\ nhej ho \ n aaa \ r \ n \ na \ n'"
Mike Gleen
2

Si alguien decide utilizar replace, usted debe tratar r'\n'vez'\n'

mystring = mystring.replace(r'\n', ' ').replace(r'\r', '')
Anar Salimkhanov
fuente
¿Por qué? Recuerdo vagamente por qué es una buena idea, pero necesitamos documentarla.
Martin Burch
1
En mi caso, necesitaba hacer esto: 1. Obtener el código HTML de la base de datos 2. Obtener el texto necesario de HTML 3. Eliminar toda la nueva línea del texto 4. Insertar texto editado en un documento de hoja de cálculo Y no funcionó correctamente, a menos que yo utilizado r("literal de cadena sin formato"). Lamentablemente, no tengo idea de por qué)
Anar Salimkhanov
1

El problema con rstrip es que no funciona en todos los casos (como yo mismo he visto pocos). En su lugar, puede usar - text = text.replace ("\ n", "") esto eliminará todas las líneas nuevas \ n con un espacio.

Gracias de antemano chicos por sus votos positivos.

Ankit Dwivedi
fuente