Uzun bir metin dizisindeki tüm satır sonlarını kaldır


128

Temel olarak, kullanıcıdan konsola bir metin dizisi girmesini istiyorum, ancak dize çok uzun ve birçok satır sonu içeriyor. Tek bir metin satırı yapmak için kullanıcının dizesini alıp tüm satır sonlarını nasıl silerim? Dizeyi elde etme yöntemim çok basit.

string = raw_input("Please enter string: ")

Kullanıcıdan dizeyi almamın farklı bir yolu var mı? Mac üzerinde Python 2.7.4 çalıştırıyorum.

Not Açıkçası ben bir noob'um, bu yüzden bir çözüm en verimli olmasa bile, en basit sözdizimini kullanan çözüm takdir edilecektir.



4
@NicYoung, bu benzer ama farklı. stripdizenin içindeki değil, bir dizenin başındaki ve sonundaki boşlukları kaldırır ...
Daren Thomas

Yanıtlar:


215

Satır sonlarını nasıl girersiniz raw_input? Ancak, içinde bazı karakterler olan bir dizeye sahip olduğunuzda, kurtulmak istersiniz, sadece replaceonlardan.

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

Yukarıdaki örnekte, tüm boşlukları değiştirdim. Dize '\n', yeni satırları temsil eder. Ve \rtaşıma iadelerini temsil eder (eğer pencerelerdeyseniz, bunları alıyor olabilirsiniz ve bir saniye replacesizin için bunları halleder!).

temelde:

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

Ayrıca, stringmodülü gölgelediği için değişkeninizi çağırmanın kötü bir fikir olduğunu unutmayın string. Ben önleyeceğini ama bazen kullanmak isterdim başka isim: file. Aynı sebepten.


Mükemmel çalıştı, aptal soru için özür dilerim! İlk çözümüm dizeyi listelemek ve tüm \ n örneklerini aramaktı, ancak liste her liste girişi için yalnızca 1 karakter içerdiğinden arama yanlış döndürmeye devam etti çünkü aynı listede her ikisini birden bulamaz veya \ veya n girişi.
Ian Zane

4
Bu cevap bana çok yardımcı oldu çünkü \raraba dönüşlerinden bahsediyor . Kaldırmak için tüm yöntemleri denedim \nama yine de \rkarakterleri yakalayamadım .
Clay

1
Bu genellikle benim için işi yapar - string.replace ('\ r \ n', '')). Günlük / metin düzenleyici dosyalarının çoğu yeni satırlar için bu biçimi izleme eğilimindedir.
Quest Monger

1
Değişken adını kullanmadığınızı string, ancak benzer bir nedenle değişken adını kullanmak istemediğinizi belirtirsiniz str.
tscizzle

2
@information_interchange Bu yaklaşım, sahip olan \nancak olmayan Linux dosyalarında çalışır \r\n.
Noumenon

45

Dize değiştirmeyi kullanmayı deneyebilirsiniz:

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

Bazı metinlerle sorun yaşadım. Rstrip () kullanmayı denedim ama işe yaramadı. Replace () kullanıyorum.
Bruno Gomes

25

Dizeyi ayırıcı bağımsız değişkeni olmadan bölebilirsiniz; bu, ardışık beyaz boşluğu tek bir ayırıcı olarak ele alır (yeni satırlar ve sekmeler dahil). Ardından bir boşluk kullanarak katılın:

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


Çok güzel fikir, çünkü aynı zamanda sekmeleri, çift boşlukları da normalleştirin +1
daitangio

15

Xbelloyoruma göre güncellendi :

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

burada daha fazlasını okuyun


3
Daha yeni ısırıldım. İlk şeridi \ n belirtirseniz, \ r başarısız olur. Hiçbir şey belirtmezseniz, boşluklar \ t ve muhtemelen diğerleri kırpılır. Kullanmalısınızrstrip("\r\n")
xbello

1
rstrip('\r\n')yeterli olmayan bir dizeye sahipti ve my_string.rstrip('\r\n').replace('\n', ' ')
MMT

8

Diğer bir seçenek de normal ifadedir:

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

Ardışık satır kesmelerinin nasıl eşleştirileceği hakkında daha fazla bilgi, r'[\n\r]+'hatta r'\s+'herhangi bir beyaz boşluğu tek bir boşlukla değiştirmek bile güzel olurdu .
Risadinha

3

Dikkate alan bir yöntem

  • dizenin başında / sonunda ek beyaz karakterler
  • her satırın başında / sonunda ek beyaz karakterler
  • çeşitli son satır karakterleri

karmaşık olabilecek çok satırlı bir dizeyi alır, ör.

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

ve güzel tek satırlık dize üretir

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

GÜNCELLEME: Gereksiz boşluklar üreten birden çok yeni satır karakterini düzeltmek için:

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

Bu aşağıdakiler için de işe yarar test_str = '\nhej ho \n aaa\r\n\n\n\n\n a\n '


Bu, dizenin ortasındaki bitişik satır beslemelerinin durumunu işlemez. İki satır besleme, çıktıda iki bitişik boşlukla sonuçlanır. "Test_str = '\ nhej ho \ n aaa \ r \ n \ na \ n'"
deneyin

2

Biri kullanmaya karar verirse replace, r'\n'onun yerine denemelisin'\n'

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

Neden? Bunun neden iyi bir fikir olduğunu belli belirsiz hatırlıyorum, ancak bunu belgelememiz gerekiyor.
Martin Burch

1
Benim durumumda, bunu yapmam gerekiyordu: 1. DB'den HTML kodunu al 2. Gerekli metni HTML'den al 3. Metinden tüm yeni satırı kaldır 4. Düzenlenmiş metni bir elektronik tablo belgesine ekle Ve ben olmadıkça düzgün çalışmadı kullanılan r("ham dize değişmezi"). Maalesef neden olduğuna dair hiçbir fikrim yok)
Anar Salimkhanov

1

Rstrip ile ilgili sorun, her durumda çalışmamasıdır (kendimde çok az gördüğüm gibi). Bunun yerine - text = text.replace ("\ n", "") kullanabilirsiniz, bu, boşluk içeren tüm yeni satırı \ n kaldırır.

Olumlu oylarınız için şimdiden teşekkürler arkadaşlar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.