Видаліть усі розриви рядків з довгого рядка тексту


128

В основному я прошу користувача ввести рядок тексту в консоль, але рядок дуже довгий і включає багато перерв рядків. Як би я взяв рядок користувача та видалив усі розриви рядків, щоб він став єдиним рядком тексту. Мій метод придбання рядка дуже простий.

string = raw_input("Please enter string: ")

Чи є інший спосіб, як я повинен захоплювати рядок від користувача? Я запускаю Python 2.7.4 на Mac.

PS Ясна річ, що я нобуб, тому навіть якщо рішення не найефективніше, буде оцінено те, що використовує найпростіший синтаксис.



4
@NicYoung, це схоже, але різне. stripвидаляє пробіли на початку та в кінці рядка, а не всередині рядка ...
Дарен Томас

Відповіді:


215

Як ви вводите перерви у рядку raw_input? Але, як тільки у вас є рядок з деякими символами, які ви хочете позбутися, тільки від replaceних.

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

У наведеному вище прикладі я замінив усі пробіли. Рядок '\n'представляє нові рядки. І \rявляє собою повернення вагона (якщо ви знаходитесь у вікні, ви можете отримати їх, і секунда replaceобробляє їх за вас!).

в основному:

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

Зауважте також, що це погана ідея викликати вашу змінну string, оскільки це затінює модуль string. Інша назва я б уникнути , але хотілося б використовувати іноді: file. З тієї ж причини.


Працював чудово, вибачте за дурне запитання! Моє початкове рішення полягало в тому, щоб перерахувати рядок та шукати всі екземпляри \ n, але оскільки у списку було лише 1 символ на запис списку, пошук повертався неправдивим, оскільки він знайде або \, або n, але не обидва в тому ж списку запис.
Ян Зейн

4
Ця відповідь мені дуже допомагає, оскільки в ній згадується \rповернення вагона. Я спробував усі способи видалити, \nале все ще не захопив \rсимволів.
Глина

1
Зазвичай для мене це завдання - string.replace ('\ r \ n', ''). Більшість файлів редактора журналів / текстів, як правило, дотримуються цього формату для нових рядків.
Квест Монгер

1
Ви вказуєте, що не використовуєте ім'я змінної string, але з подібної причини ви не хочете використовувати ім'я змінної str.
tscizzle

2
@information_interchange Цей підхід працює для файлів Linux, які мають, \nале не мають \r\n.
Ноумен

45

Ви можете спробувати використати заміну рядків:

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

У мене були проблеми з деякими текстами. Я намагався використовувати rstrip (), але не вийшло. Я використовую substitu ().
Бруно Гомес

25

Ви можете розділити рядок без аргументу роздільника, який буде розглядати послідовний пробіл як єдиний роздільник (включаючи нові рядки та вкладки). Потім приєднайтеся, використовуючи пробіл:

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


Дуже приємна ідея, адже нормалізуйте також вкладки, подвійні пробіли і так далі +1
daitangio

15

оновлено на основі Xbelloкоментаря:

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

докладніше читайте тут


3
Мене це просто вкусило. Якщо вказати \ n для rstrip, \ r не вдасться. Якщо ви нічого не вказуєте, пробіли, \ t і, можливо, інші обрізаються. Ви повинні скористатисяrstrip("\r\n")
xbello

1
була струна, де просто rstrip('\r\n')не вистачало, і з нею треба було йти:my_string.rstrip('\r\n').replace('\n', ' ')
MMT

8

Інший варіант - регулярне вираження:

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

Більше інформації про те, як відповідати послідовним розривам рядків, було б непогано r'[\n\r]+'або навіть r'\s+'замінити будь-який пробіл на один пробіл.
Risadinha

3

Метод з урахуванням

  • додаткові білі символи на початку / в кінці рядка
  • додаткові білі символи на початку / кінці кожного рядка
  • різні символи кінцевих рядків

вона займає таку багаторядкову рядок, яка може бути безладно, наприклад

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

і створює хороший однорядковий рядок

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

ОНОВЛЕННЯ: Щоб виправити кілька символів нового рядка, створюючи зайві пробіли:

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

Це працює і для наступного test_str = '\nhej ho \n aaa\r\n\n\n\n\n a\n '


Це не обробляє випадок суміжних каналів рядків посередині рядка. Двоє рядкових каналів призводять до двох суміжних заготовок на виході. Спробуйте "test_str = '\ nhej ho \ n aaa \ r \ n \ na \ n'"
Майк Глін

2

Якщо хто - небудь вирішить використовувати replace, ви повинні спробувати r'\n'замість'\n'

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

Чому? Я смутно пам'ятаю, чому це гарна ідея, але нам потрібно її документувати.
Мартін Берч

1
У моєму випадку мені потрібно було зробити це: 1. Отримати HTML-код з DB 2. Отримати потрібний текст з HTML 3. Видаліть увесь новий рядок із тексту 4. Вставте відредагований текст у документ електронної таблиці. І він не працював належним чином, якщо я не used r("необмежений рядковий літерал"). На жаль, я поняття не маю, чому)
Анар Салімханов

1

Проблема з rstrip полягає в тому, що він працює не у всіх випадках (як я сам мало бачив). Натомість ви можете використовувати - text = text.replace ("\ n", ""), це видалить увесь новий рядок \ n із пробілом.

Заздалегідь дякую, хлопці, за ваші результати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.