Что такое быстрое однострочное удаление пустых строк из строки Python? - PullRequest
52 голосов
/ 17 июля 2009

У меня есть некоторый код в строке Python, который содержит посторонние пустые строки. Я хотел бы удалить все пустые строки из строки. Какой самый питонный способ сделать это?

Примечание: я не ищу обычного перекодировщика кода, просто быстрый или двухстрочный.

Спасибо!

Ответы [ 9 ]

79 голосов
/ 17 июля 2009

Как насчет:

text = os.linesep.join([s for s in text.splitlines() if s])

где text - строка с возможными посторонними строками?

14 голосов
/ 17 июля 2009
"\n".join([s for s in code.split("\n") if s])

Edit2:

text = "".join([s for s in code.splitlines(True) if s.strip("\r\n")])

Я думаю, это моя последняя версия. Он должен хорошо работать даже с окончаниями строк, смешивающих код. Я не думаю, что строку с пробелами следует считать пустой, но если это так, то вместо этого подойдет простая s.strip ().

12 голосов
/ 17 июля 2009
filter(None, code.splitlines())
filter(str.strip, code.splitlines())

эквивалентно

[s for s in code.splitlines() if s]
[s for s in code.splitlines() if s.strip()]

и может быть полезно для удобства чтения

10 голосов
/ 12 июня 2014

УРОК ПО УДАЛЕНИЮ НОВОСТЕЙ И ПУСТЫХ ЛИНИЙ С ПРОСТРАНСТВАМИ

«t» - это переменная с текстом. Вы увидите переменную "s", ее временную переменную, которая существует только во время вычисления основного набора скобок (забыл название этих вещей lil python)

Сначала давайте установим переменную "t", чтобы она имела новые строки:

>>> t='hi there here is\na big line\n\nof empty\nline\neven some with spaces\n       \nlike that\n\n    \nokay now what?\n'

Обратите внимание, что есть другой способ установить переменную с помощью тройных кавычек

somevar="""
   asdfas
asdf

  asdf

  asdf

asdf
""""

Вот как это выглядит, когда мы видим его без «печати»:

>>> t
'hi there here is\na big line\n\nof empty\nline\neven some with spaces\n       \nlike that\n\n    \nokay now what?\n' 

Чтобы увидеть фактические символы новой строки, напечатайте его.

>>> print t
hi there here is
a big line

of empty
line
even some with spaces

like that


okay now what?

КОМАНДА УДАЛИТЬ ВСЕ ПУСТОЙ ЛИНИИ (ВКЛЮЧАЯ ПРОСТРАНСТВО):

Так что некоторые строки - это новые строки, а некоторые имеют пробелы, которые выглядят как новые строки

Если вы хотите избавиться от всех пустых строк (если в них есть только новые строки или пробелы)

>>> print "".join([s for s in t.strip().splitlines(True) if s.strip()])
hi there here is
a big line
of empty
line
even some with spaces
like that
okay now what?

OR

>>> print "".join([s for s in t.strip().splitlines(True) if s.strip("\r\n").strip()])
hi there here is
a big line
of empty
line
even some with spaces
like that
okay now what?

ПРИМЕЧАНИЕ: эта полоса в t.strip (). Splitline (True) может быть удалена, так что это просто t.splitlines (True), но тогда ваш вывод может заканчиваться дополнительной новой строкой (так что удаляется последняя новая строка). Strip () в последней части s.strip ("\ r \ n"). Strip () и s.strip () - это то, что фактически удаляет пробелы в новых и новых строках.

КОМАНДА УДАЛИТЕ ВСЕ ПУСТОЙ ЛИНИИ (НО НЕ ОДИН С ПРОСТРАНСТВАМИ):

Технически строки с пробелами НЕ следует считать пустыми, но все зависит от варианта использования и того, чего вы пытаетесь достичь.

>>> print "".join([s for s in t.strip().splitlines(True) if s.strip("\r\n")])
hi there here is
a big line
of empty
line
even some with spaces

like that

okay now what?

** ОТМЕТЬТЕ ОБ ЭТОЙ СРЕДНЕЙ полосе **

Эта средняя полоса, прикрепленная к переменной "t", просто удаляет последний символ новой строки (как и в предыдущей заметке). Вот как бы это выглядело без этой полосы (обратите внимание, что последний перевод строки)

С 1-м примером (удаление новых и новых строк с пробелами)

>>> print "".join([s for s in t.strip().splitlines(True) if s.strip("\r\n").strip()])
hi there here is
a big line
of empty
line
even some with spaces
like that
okay now what?
.without strip new line here (stackoverflow cant have me format it in).

Со вторым примером (удаление только новых строк)

>>> print "".join([s for s in t.strip().splitlines(True) if s.strip("\r\n")])
hi there here is
a big line
of empty
line
even some with spaces

like that

okay now what?
.without strip new line here (stackoverflow cant have me format it in).

КОНЕЦ!

5 голосов
/ 20 декабря 2017

Используя функцию re.sub

re.sub(r'^$\n', '', s, flags=re.MULTILINE)
2 голосов
/ 26 сентября 2017

Вот решение в одну строку:

print("".join([s for s in mystr.splitlines(True) if s.strip()]))
2 голосов
/ 17 июля 2009

Этот также удалит строки пробелов.

re.replace(u'(?imu)^\s*\n', u'', code)

0 голосов
/ 02 января 2019

расширяя ответ ymv, вы можете использовать filter с join, чтобы получить желаемую строку,

"".join(filter(str.strip, sample_string.splitlines(True)))
0 голосов
/ 17 июля 2009

А теперь для чего-то совершенно другого:

Python 1.5.2 (#0, Apr 13 1999, 10:51:12) [MSC 32 bit (Intel)] on win32
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>> import string, re
>>> tidy = lambda s: string.join(filter(string.strip, re.split(r'[\r\n]+', s)), '\n')
>>> tidy('\r\n   \n\ra\n\n   b   \r\rc\n\n')
'a\012   b   \012c'

Эпизод 2:

Этот не работает на 1.5: - (

НО он не только обрабатывает универсальные символы новой строки и пустые строки, он также удаляет завершающие пробелы (хорошая идея при приведении в порядок строк кода ИМХО) И выполняет работу по восстановлению, если последняя значащая строка не завершена.

import re
tidy = lambda c: re.sub(
    r'(^\s*[\r\n]+|^\s*\Z)|(\s*\Z|\s*[\r\n]+)',
    lambda m: '\n' if m.lastindex == 2 else '',
    c)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...