Hapus semua jeda baris dari string teks yang panjang

128

Pada dasarnya, saya meminta pengguna untuk memasukkan string teks ke konsol, tetapi string tersebut sangat panjang dan mencakup banyak jeda baris. Bagaimana saya akan mengambil string pengguna dan menghapus semua jeda baris untuk membuatnya menjadi satu baris teks. Metode saya untuk mendapatkan string sangat sederhana.

string = raw_input("Please enter string: ")

Apakah ada cara berbeda yang harus saya ambil string dari pengguna? Saya menjalankan Python 2.7.4 di Mac.

PS Jelas saya seorang noob, jadi bahkan jika suatu solusi bukan yang paling efisien, yang menggunakan sintaksis paling sederhana akan dihargai.

Ian Zane
sumber
4
@NicYoung, itu mirip tapi berbeda. stripmenghapus spasi putih di awal dan akhir string, bukan di dalam string ...
Daren Thomas

Jawaban:

214

Bagaimana Anda memasuki jeda baris raw_input? Tapi, begitu Anda memiliki string dengan beberapa karakter di dalamnya Anda ingin menyingkirkan, hanya replacemereka.

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

Pada contoh di atas, saya mengganti semua spasi. String '\n'mewakili baris baru. Dan \rmewakili pengembalian carriage (jika Anda berada di windows, Anda mungkin mendapatkan ini dan yang kedua replaceakan menanganinya untuk Anda!).

pada dasarnya:

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

Perhatikan juga, itu adalah ide yang buruk untuk memanggil variabel Anda string, karena ini membayangi modul string. Nama lain saya akan menghindari tapi akan senang untuk menggunakan kadang-kadang: file. Untuk alasan yang sama.

Daren Thomas
sumber
Bekerja dengan sempurna, maaf untuk pertanyaan bodoh! Solusi awal saya adalah mencantumkan string dan mencari semua contoh \ n, tetapi karena daftar tersebut hanya memiliki 1 karakter per entri daftar, pencarian tetap salah karena akan menemukan \ atau n tetapi tidak keduanya dalam daftar yang sama masuk.
Ian Zane
4
Jawaban ini sangat membantu saya karena menyebutkan \rcarriage return. Saya sudah mencoba semua metode untuk menghapus \ntetapi masih belum menangkap\r karakter.
Clay
1
Ini biasanya berfungsi untuk saya - string.replace ('\ r \ n', '')). Sebagian besar file log / editor teks cenderung mengikuti format ini untuk baris baru.
Quest Monger
1
Anda menunjukkan tidak menggunakan nama variabel string, tetapi untuk alasan yang sama Anda tidak ingin menggunakan nama variabel str.
tscizzle
2
@information_interchange Pendekatan ini berfungsi pada file Linux yang memiliki \ntetapi tidak \r\n.
Noumenon
45

Anda dapat mencoba menggunakan penggantian string:

string = string.replace('\r', '').replace('\n', '')
Konstantin Dinev
sumber
Saya punya masalah dengan beberapa teks. Saya mencoba menggunakan rstrip (), tetapi tidak berhasil. Saya menggunakan ganti ().
Bruno Gomes
25

Anda dapat membagi string tanpa arg pemisah, yang akan memperlakukan spasi kosong berturut-turut sebagai pemisah tunggal (termasuk baris baru dan tab). Kemudian bergabunglah menggunakan spasi:

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
sumber
Ide yang
15

diperbarui berdasarkan Xbellokomentar:

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

baca lebih lanjut di sini

tokhi
sumber
3
Saya baru saja digigit oleh ini. Jika Anda menentukan \ n untuk rstrip, \ r gagal. Jika Anda tidak menentukan apa-apa, spasi, \ t dan mungkin yang lain dipangkas. Anda harus menggunakanrstrip("\r\n")
xbello
1
punya string di mana rstrip('\r\n')tidak cukup dan harus pergi dengan:my_string.rstrip('\r\n').replace('\n', ' ')
MMT
8

Pilihan lain adalah regex:

>>> import re
>>> re.sub("\n|\r", "", "Foo\n\rbar\n\rbaz\n\r")
'Foobarbaz'
Neil
sumber
info lebih lanjut tentang cara mencocokkan linebreak berturut-turut akan lebih baik r'[\n\r]+'atau bahkan r'\s+'untuk mengganti spasi putih dengan satu spasi.
Risadinha
3

Metode yang mempertimbangkan

  • karakter putih tambahan di awal / akhir string
  • karakter putih tambahan di awal / akhir setiap baris
  • berbagai karakter garis akhir

dibutuhkan multi-line string yang mungkin berantakan misalnya

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

dan menghasilkan string satu baris yang bagus

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

UPDATE: Untuk memperbaiki beberapa karakter baris baru yang menghasilkan ruang berlebihan:

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

Ini juga berfungsi sebagai berikut test_str = '\nhej ho \n aaa\r\n\n\n\n\n a\n '

Kamil Neczaj
sumber
Ini tidak menangani kasus feed baris yang berdekatan di tengah-tengah string. Dua umpan baris menghasilkan dua kosong yang berdekatan dalam output. Coba "test_str = '\ nhej ho \ n aaa \ r \ n \ na \ n'"
Mike Gleen
2

Jika ada yang memutuskan untuk menggunakan replace, Anda harus mencoba r'\n'gantinya'\n'

mystring = mystring.replace(r'\n', ' ').replace(r'\r', '')
Anar Salimkhanov
sumber
Mengapa? Samar-samar saya ingat mengapa ini adalah ide yang bagus, tetapi kita perlu mendokumentasikannya.
Martin Burch
1
Dalam kasus saya, saya perlu melakukan ini: 1. Dapatkan kode HTML dari DB 2. Dapatkan teks yang diperlukan dari HTML 3. Hapus semua baris baru dari teks 4. Masukkan teks yang diedit ke dokumen spreadsheet Dan itu tidak berfungsi dengan baik, kecuali saya digunakan r("string baku literal"). Sayangnya, saya tidak tahu mengapa)
Anar Salimkhanov
1

Masalahnya dengan rstrip adalah bahwa ia tidak bekerja dalam semua kasus (seperti yang saya sendiri telah melihat beberapa). Sebagai gantinya Anda dapat menggunakan - text = text.replace ("\ n", "") ini akan menghapus semua baris baru \ n dengan spasi.

Terima kasih sebelumnya, teman-teman untuk upvotes Anda.

Ankit Dwivedi
sumber