Usuń wszystkie podziały wierszy z długiego ciągu tekstu

128

Zasadniczo proszę użytkownika o wprowadzenie ciągu tekstu do konsoli, ale ciąg jest bardzo długi i zawiera wiele znaków końca wiersza. W jaki sposób wziąłbym ciąg użytkownika i usunął wszystkie podziały wierszy, aby był pojedynczym wierszem tekstu. Moja metoda pozyskiwania struny jest bardzo prosta.

string = raw_input("Please enter string: ")

Czy istnieje inny sposób pobierania ciągu od użytkownika? Używam Pythona 2.7.4 na komputerze Mac.

PS Najwyraźniej jestem noobem, więc nawet jeśli rozwiązanie nie jest najbardziej wydajne, doceniłoby to, które używa najprostszej składni.

Ian Zane
źródło
4
@NicYoung, to jest podobne, ale inne. stripusuwa białe znaki na początku i na końcu ciągu, a nie wewnątrz ciągu ...
Daren Thomas

Odpowiedzi:

215

Jak wprowadza się znaki końca wiersza raw_input? Ale kiedy już masz ciąg z kilkoma znakami, których chcesz się pozbyć, tylko replaceich.

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

W powyższym przykładzie zamieniłem wszystkie spacje. Ciąg '\n'reprezentuje nowe linie. I \rreprezentuje powroty karetki (jeśli jesteś w systemie Windows, możesz je dostać, a sekunda replacezajmie się nimi za Ciebie!).

gruntownie:

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

Zwróć również uwagę, że wywoływanie zmiennej jest złym pomysłem string, ponieważ zacienia to moduł string. Inna nazwa chciałbym uniknąć, ale chciałbym użyć czasami: file. Z tego samego powodu.

Daren Thomas
źródło
Zadziałało idealnie, przepraszam za głupie pytanie! Moim początkowym rozwiązaniem było wypisanie ciągu i wyszukanie wszystkich wystąpień \ n, ale ponieważ lista miała tylko 1 znak na wpis na liście, wyszukiwanie nadal zwracało fałsz, ponieważ znajdowałoby albo \ lub n, ale nie oba na tej samej liście wejście.
Ian Zane
4
Ta odpowiedź jest dla mnie bardzo pomocna, ponieważ wspomina o \rpowrotach karetki. Próbowałem wszystkich metod usuwania, \nale nadal nie udało mi się uchwycić \rpostaci.
Clay
1
Zwykle działa to za mnie - string.replace ('\ r \ n', '')). Większość plików dziennika / edytorów tekstu ma ten format dla nowych wierszy.
Quest Monger
1
Wskazujesz, że nie używasz nazwy zmiennej string, ale z podobnego powodu nie chcesz używać nazwy zmiennej str.
tscizzle
2
@information_interchange To podejście działa w przypadku plików systemu Linux, które mają, \nale nie \r\n.
Noumenon
45

Możesz spróbować użyć zamiany ciągu:

string = string.replace('\r', '').replace('\n', '')
Konstantin Dinev
źródło
Miałem problem z niektórymi tekstami. Próbowałem użyć rstrip (), ale nie zadziałało. Używam replace ().
Bruno Gomes
25

Możesz podzielić ciąg bez argumentu separatora, który będzie traktował kolejne białe spacje jako pojedynczy separator (łącznie z nowymi liniami i tabulatorami). Następnie dołącz używając spacji:

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
źródło
Bardzo fajny ide, ponieważ normalizuję również tabulatory, podwójne spacje i tak dalej +1
daitangio
15

zaktualizowane na podstawie Xbellokomentarza:

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

czytaj więcej tutaj

tokhi
źródło
3
Właśnie to ugryzło. Jeśli określisz \ n do rstrip, \ r nie powiedzie się. Jeśli nic nie określisz, spacje, \ t i prawdopodobnie inne zostaną usunięte. Musisz użyćrstrip("\r\n")
xbello
1
miał ciąg, który po prostu rstrip('\r\n')nie był wystarczający i musiał iść z:my_string.rstrip('\r\n').replace('\n', ' ')
MMT
8

Inną opcją jest regex:

>>> import re
>>> re.sub("\n|\r", "", "Foo\n\rbar\n\rbaz\n\r")
'Foobarbaz'
Neil
źródło
więcej informacji na temat dopasowywania kolejnych podziałów wierszy byłoby fajne, r'[\n\r]+'a nawet r'\s+'zastąpienie dowolnego białego znaku pojedynczą spacją.
Risadinha
3

Metoda uwzględniająca

  • dodatkowe białe znaki na początku / końcu łańcucha
  • dodatkowe białe znaki na początku / końcu każdego wiersza
  • różne znaki końca linii

przyjmuje taki wieloliniowy ciąg, który może być niechlujny np

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

i tworzy ładny jednowierszowy ciąg

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

AKTUALIZACJA: Aby naprawić wiele znaków nowej linii powodujących zbędne spacje:

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

Działa to również w przypadku następujących test_str = '\nhej ho \n aaa\r\n\n\n\n\n a\n '

Kamil Neczaj
źródło
To nie obsługuje przypadku ciągłych wysuwów wiersza w środku ciągu. Dwa nowe wiersze powodują wyświetlenie dwóch ciągłych spacji. Spróbuj „test_str = '\ nhej ho \ n aaa \ r \ n \ na \ n'"
Mike Gleen,
2

Jeśli ktoś zdecyduje się skorzystać replace, powinieneś spróbować r'\n'zamiast tego'\n'

mystring = mystring.replace(r'\n', ' ').replace(r'\r', '')
Anar Salimkhanov
źródło
Czemu? Niewyraźnie pamiętam, dlaczego jest to dobry pomysł, ale musimy to udokumentować.
Martin Burch
1
W moim przypadku musiałem zrobić to: 1. Pobierz kod HTML z DB 2. Pobierz potrzebny tekst z HTML 3. Usuń cały nowy wiersz z tekstu 4. Wstaw edytowany tekst do arkusza kalkulacyjnego. I to nie działało poprawnie, chyba że used r("surowy literał ciągu"). Niestety nie mam pojęcia dlaczego)
Anar Salimkhanov
1

Problem z rstripem polega na tym, że nie działa we wszystkich przypadkach (jak sam widziałem kilka). Zamiast tego możesz użyć - text = text.replace ("\ n", "") to usunie całą nową linię \ n ze spacją.

Z góry dziękuję za wasze pozytywne opinie.

Ankit Dwivedi
źródło