^(\s+)
удаляет только пробелы из первой строки. Как удалить передние пробелы со всех строк?
Python: используйте регулярное выражение для удаления пробела со всех строк
Ответ 1
Модуль regex для Python не по умолчанию многострочный ^
соответствие, поэтому вам нужно явно указать этот флаг.
r = re.compile(r"^\s+", re.MULTILINE)
r.sub("", "a\n b\n c") # "a\nb\nc"
# or without compiling (only possible for Python 2.7+ because the flags option
# didn't exist in earlier versions of re.sub)
re.sub(r"^\s+", "", "a\n b\n c", flags = re.MULTILINE)
# but mind that \s includes newlines:
r.sub("", "a\n\n\n\n b\n c") # "a\nb\nc"
Также возможно включить флаг в строку к шаблону:
re.sub(r"(?m)^\s+", "", "a\n b\n c")
Более простым решением является избежание регулярных выражений, потому что исходная проблема очень проста:
content = 'a\n b\n\n c'
stripped_content = ''.join(line.lstrip(' \t') for line in content.splitlines(True))
# stripped_content == 'a\nb\n\nc'
Ответ 2
@AndiDog подтверждает в своем (в настоящее время принятом) ответе, что он обменивает последовательные строки новой строки.
Здесь, как исправить этот недостаток, вызванный тем, что \n
является ОБЫЧИМ пробелом и разделителем строк. Нам нужно сделать re-класс, который включает только пробельные символы, отличные от новой строки.
Мы хотим whitespace and not newline
, который не может быть выражен непосредственно в классе re. Перепишите это как not not (whitespace and not newline)
ie not(not whitespace or not not newline
(спасибо, Augustus), т.е. not(not whitespace or newline)
т.е. [^\S\n]
в re
нотации.
Итак:
>>> re.sub(r"(?m)^[^\S\n]+", "", " a\n\n \n\n b\n c\nd e")
'a\n\n\n\nb\nc\nd e'
Ответ 3
вы можете попробовать strip()
, если хотите удалить передний и задний, или lstrip()
, если передняя
>>> s=" string with front spaces and back "
>>> s.strip()
'string with front spaces and back'
>>> s.lstrip()
'string with front spaces and back '
for line in open("file"):
print line.lstrip()
Если вы действительно хотите использовать regex
>>> import re
>>> re.sub("^\s+","",s) # remove the front
'string with front spaces and back '
>>> re.sub("\s+\Z","",s)
' string with front spaces and back' #remove the back
Ответ 4
nowhite = ''.join(mytext.split())
Без пробелов останется, как вы просили (все помещено как одно слово). Более полезным обычно является объединение всех с ' '
или '\n'
для сохранения слов отдельно.
Ответ 5
Вам нужно будет использовать опцию re.MULTILINE:
re.sub("(?m)^\s+", "", text)
Часть "(? m)" позволяет использовать многострочный формат.
Ответ 6
На самом деле вам больше не нужны регулярные выражения. Если вы хотите удалить общий отступ в нескольких строках, попробуйте модуль textwrap
:
>>> import textwrap
>>> messy_text = " grrr\n whitespace\n everywhere"
>>> print textwrap.dedent(messy_text)
grrr
whitespace
everywhere
Обратите внимание, что если отступ нерегулярный, это будет поддерживать:
>>> very_messy_text = " grrr\n \twhitespace\n everywhere"
>>> print textwrap.dedent(very_messy_text)
grrr
whitespace
everywhere