Rimuovi tutte le interruzioni di riga da una lunga stringa di testo


128

Fondamentalmente, sto chiedendo all'utente di inserire una stringa di testo nella console, ma la stringa è molto lunga e include molte interruzioni di riga. Come prenderei la stringa dell'utente ed eliminerei tutte le interruzioni di riga per renderla una singola riga di testo. Il mio metodo per acquisire la stringa è molto semplice.

string = raw_input("Please enter string: ")

C'è un modo diverso in cui dovrei prendere la stringa dall'utente? Sto eseguendo Python 2.7.4 su un Mac.

PS Chiaramente sono un noob, quindi anche se una soluzione non è la più efficiente, sarebbe apprezzata quella che utilizza la sintassi più semplice.



4
@NicYoung, è simile ma diverso. striprimuove gli spazi bianchi all'inizio e alla fine di una stringa, non all'interno della stringa ...
Daren Thomas

Risposte:


214

Come si inseriscono le interruzioni di riga con raw_input? Ma, una volta che hai una stringa con alcuni personaggi dentro di cui vuoi liberarti, solo replaceloro.

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

Nell'esempio sopra, ho sostituito tutti gli spazi. La stringa '\n'rappresenta le nuove righe. E \rrappresenta i ritorni a capo (se sei su Windows, potresti ottenerli e un secondo replaceli gestirà per te!).

fondamentalmente:

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

Nota anche che è una cattiva idea chiamare la tua variabile string, in quanto ciò ombreggia il modulo string. Un altro nome Eviterei ma mi piacerebbe usare a volte: file. Per la stessa ragione.


Ha funzionato perfettamente, scusa per la domanda stupida! La mia soluzione iniziale era di elencare la stringa e cercare tutte le istanze di \ n, ma poiché l'elenco aveva solo 1 carattere per voce di elenco, la ricerca continuava a restituire false perché avrebbe trovato \ o n ma non entrambi nella stessa lista iscrizione.
Ian Zane,

4
Questa risposta mi è molto utile perché menziona i \rritorni a capo. Ho provato tutti i metodi per rimuovere \nma non riuscivo ancora a catturare i \rpersonaggi.
Clay

1
Questo di solito fa il lavoro per me: string.replace ('\ r \ n', '')). La maggior parte dei file di log / editor di testo tende a seguire questo formato per le nuove righe.
Quest Monger,

1
stringFai notare di non usare il nome della variabile , ma per un motivo simile non vuoi usare il nome della variabile str.
martedì

2
@information_interchange Questo approccio funziona su file Linux che hanno \nma non \r\n.
Noumenon,

45

Puoi provare a utilizzare la stringa di sostituzione:

string = string.replace('\r', '').replace('\n', '')

Ho avuto un problema con alcuni messaggi. Ho provato a usare rstrip (), ma non ha funzionato. Uso sostituire ().
Bruno Gomes,

25

È possibile dividere la stringa senza arg separatore, che tratterà gli spazi bianchi consecutivi come un singolo separatore (inclusi newline e tab). Quindi unisciti usando uno spazio:

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


Molto bello ide, perché normalizza anche tabulazioni, doppi spazi e così via +1
daitangio

15

aggiornato in base al Xbellocommento:

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

leggi di più qui


3
Sono stato appena morso da questo. Se si specifica \ n da rstrip, \ r ha esito negativo. Se non si specifica nulla, gli spazi, \ t e possibilmente altri vengono tagliati. Devi usarerstrip("\r\n")
xbello il

1
aveva una stringa in cui semplicemente rstrip('\r\n')non era abbastanza e doveva andare con:my_string.rstrip('\r\n').replace('\n', ' ')
MMT

8

Un'altra opzione è regex:

>>> import re
>>> re.sub("\n|\r", "", "Foo\n\rbar\n\rbaz\n\r")
'Foobarbaz'

maggiori informazioni su come abbinare le interruzioni di riga consecutive sarebbero utili r'[\n\r]+'o addirittura r'\s+'per sostituire qualsiasi spazio bianco con un singolo spazio.
Risadinha,

3

Un metodo da prendere in considerazione

  • caratteri bianchi aggiuntivi all'inizio / alla fine della stringa
  • caratteri bianchi aggiuntivi all'inizio / alla fine di ogni riga
  • vari personaggi di fine linea

prende una tale stringa multilinea che può essere disordinata, ad es

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

e produce una piacevole stringa di una riga

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

AGGIORNAMENTO: per correggere più caratteri di nuova riga producendo spazi ridondanti:

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

Questo funziona anche per quanto segue test_str = '\nhej ho \n aaa\r\n\n\n\n\n a\n '


Questo non gestisce il caso di avanzamenti di riga contigui nel mezzo della stringa. Due avanzamenti di riga producono due spazi contigui nell'output. Prova "test_str = '\ nhej ho \ n aaa \ r \ n \ na \ n'"
Mike Gleen,

2

Se qualcuno decide di usare replace, dovresti provare r'\n'invece'\n'

mystring = mystring.replace(r'\n', ' ').replace(r'\r', '')

Perché? Ricordo vagamente perché questa è una buona idea, ma dobbiamo documentarla.
Martin Burch,

1
Nel mio caso, dovevo fare questo: 1. Ottieni il codice HTML dal DB 2. Ottieni il testo necessario dall'HTML 3. Rimuovi tutta la nuova riga dal testo 4. Inserisci il testo modificato in un documento di foglio di calcolo E non ha funzionato correttamente, a meno che usato r("letterale stringa grezza"). Sfortunatamente, non ho idea del perché)
Anar Salimkhanov il

1

Il problema con rstrip è che non funziona in tutti i casi (come ho visto io stesso pochi). Invece puoi usare - text = text.replace ("\ n", "") per rimuovere tutte le nuove righe \ n con uno spazio.

Grazie in anticipo ragazzi per i vostri voti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.