Ответ 1
Как насчет:
text = os.linesep.join([s for s in text.splitlines() if s])
где text
- строка с возможными посторонними строками?
У меня есть код в строке python, который содержит посторонние пустые строки. Я хотел бы удалить все пустые строки из строки. Какой самый питонический способ сделать это?
Примечание. Я не ищу общий реформатор кода, просто быстрый или двухстрочный.
Спасибо!
Как насчет:
text = os.linesep.join([s for s in text.splitlines() if s])
где text
- строка с возможными посторонними строками?
"\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().
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()]
и может быть полезен для удобства чтения
УРОК НА УДАЛЕНИЕ НОВЫХ ЛИНИЙ И ПУСТЫХ ЛИНИЙ С ПРОСТРАНСТВАМИ
"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
""""
Вот как это выглядит, когда мы просматриваем его без "print":
>>> 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?
ИЛИ
>>> 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), но тогда ваш вывод может завершиться добавлением новой строки (чтобы удалить последнюю новую строку). Полоса() в последней части 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).
КОНЕЦ!
Используя функцию re.sub
re.sub(r'^$\n', '', s, flags=re.MULTILINE)
Это также удалит строки пробелов.
re.replace(u'(?imu)^\s*\n', u'', code)
print("".join([s for s in mystr.splitlines(True) if s.strip()]))
И теперь для чего-то совершенно другого:
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: - (
НО не только обрабатывает универсальные символы новой строки и пустые строки, но также удаляет конечные пробелы (хорошая идея при упорядочивании строк кода IMHO) И выполняет ремонт, если последняя значимая строка не заканчивается.
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)
развивая ответ ymv, вы можете использовать filter
с join
чтобы получить желаемую строку,
"".join(filter(str.strip, sample_string.splitlines(True)))
Этот код удаляет пустые строки (с пробелами или без них).
import re
re.sub(r'\n\s*\n', '\n', text, flags=re.MULTILINE)