Remova todas as quebras de linha de uma longa sequência de texto


128

Basicamente, estou pedindo ao usuário que insira uma sequência de texto no console, mas a sequência é muito longa e inclui muitas quebras de linha. Como eu pegaria a string do usuário e excluiria todas as quebras de linha para torná-la uma única linha de texto. Meu método para adquirir a string é muito simples.

string = raw_input("Please enter string: ")

Existe uma maneira diferente de pegar a string do usuário? Estou executando o Python 2.7.4 em um Mac.

PS É claro que sou um noob; portanto, mesmo que uma solução não seja a mais eficiente, a que usa a sintaxe mais simples seria apreciada.



4
@ NicYoung, isso é semelhante, mas diferente. stripremove espaços em branco no início e final de uma string, e não dentro da corda ...
Daren Thomas

Respostas:


214

Como você insere quebras de linha raw_input? Mas, uma vez que você tenha uma string com alguns caracteres dos quais deseja se livrar, apenas replaceeles.

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

No exemplo acima, substituí todos os espaços. A sequência '\n'representa novas linhas. E \rrepresenta retornos de carro (se você estiver no Windows, poderá obter esses e um segundoreplace cuidará deles para você!).

basicamente:

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

Observe também que é uma má idéia chamar sua variável string, pois isso oculta o módulo string. Outro nome que eu gostaria de evitar, mas gostariam de usar às vezes: file. Pela mesma razão.


Funcionou perfeitamente, desculpe pela pergunta estúpida! Minha solução inicial foi listar a string e procurar todas as instâncias de \ n, mas como a lista tinha apenas 1 caractere por entrada na lista, a pesquisa continuava retornando false porque encontraria \ ou n, mas não ambos na mesma lista entrada.
Ian Zane

4
Esta resposta é muito útil para mim porque menciona a \r retornos de carro. Eu tentei todos os métodos para remover, \nmas ainda não estava capturando os \rcaracteres.
argila

1
Isso geralmente faz o trabalho para mim - string.replace ('\ r \ n', '')). A maioria dos arquivos de log / editor de texto tende a seguir esse formato para novas linhas.
Quest Monger

1
Você indica que não está usando o nome da variável string, mas, por um motivo semelhante, não deseja usar o nome da variável str.
tscizzle

2
@information_interchange Essa abordagem funciona em arquivos Linux que possuem, \nmas não possuem \r\n.
Noumenon

45

Você pode tentar usar a sequência de substituição:

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

Eu tive um problema com alguns textos. Eu tentei usar o rstrip (), mas não funcionou. Eu uso replace ().
Bruno Gomes

25

Você pode dividir a sequência sem o separador arg, que tratará os espaços em branco consecutivos como um único separador (incluindo novas linhas e guias). Em seguida, junte-se usando um espaço:

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


IDE muito bom, porque normaliza também tabulações, espaços duplos e assim por diante +1
daitangio 20/04

15

atualizado com base no Xbellocomentário:

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

leia mais aqui


3
Eu fui mordido por isso. Se você especificar \ n para retirar, \ r falhará. Se você não especificar nada, espaços, \ te possivelmente outros serão cortados. Você deve usarrstrip("\r\n")
xbello

1
tinha uma string onde simplesmente rstrip('\r\n')não era suficiente e tinha que ir com:my_string.rstrip('\r\n').replace('\n', ' ')
MMT 15/06

8

Outra opção é regex:

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

mais informações sobre como combinar quebras de linha consecutivas seriam boas r'[\n\r]+'ou até mesmo r'\s+'substituir qualquer espaço em branco por um único espaço.
Risadinha

3

Um método que leva em consideração

  • caracteres brancos adicionais no início / fim da string
  • caracteres brancos adicionais no início / fim de cada linha
  • vários caracteres de linha final

é preciso uma seqüência de várias linhas que pode ser confusa, por exemplo

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

e produz uma bela string de uma linha

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

UPDATE: Para corrigir vários caracteres de nova linha produzindo espaços redundantes:

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

Isso funciona para o seguinte também test_str = '\nhej ho \n aaa\r\n\n\n\n\n a\n '


Isso não lida com o caso de feeds de linha contíguos no meio da string. Duas alimentações de linha resultam em dois espaços em branco contíguos na saída. Tente "test_str = '\ nhej ho \ n aaa \ r \ n \ na \ n'" "
Mike Gleen

2

Se alguém decide usar replace, você deve tentar r'\n', em vez'\n'

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

Por quê? Lembro-me vagamente de por que essa é uma boa ideia, mas precisamos documentá-la.
Martin Burch

1
No meu caso, eu precisava fazer o seguinte: 1. Obter código HTML do DB 2. Obter texto necessário do HTML 3. Remover toda a nova linha do texto 4. Inserir texto editado em um documento de planilha E não funcionar corretamente, a menos que eu usado r("literal de cadeia de caracteres brutos"). Infelizmente, eu não tenho idéia do porquê)
Anar Salimkhanov 04/07

1

O problema com o rstrip é que ele não funciona em todos os casos (como eu mesmo já vi poucos). Em vez disso, você pode usar - text = text.replace ("\ n", "") isso removerá todas as novas linhas \ n com um espaço.

Agradecemos antecipadamente a vocês por seus votos.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.