Подтвердить что ты не робот

Python: используйте регулярное выражение для удаления пробела со всех строк

^(\s+) удаляет только пробелы из первой строки. Как удалить передние пробелы со всех строк?

4b9b3361

Ответ 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