2015-08-19 3 views
-1

Я не могу понять поведение re.sub pythons. Я хочу заменить целую многострочную строку ничем. Я хочу, чтобы пустая строка обратно:Почему re.sub не заменяет строку пустой строкой

#!/usr/bin/python 

import re 


if __name__ == "__main__": 
    data = """hello 
world 
good 
day 
""" 

    textarea = re.sub('.*', '', data) 
    print "processed '%s'" % textarea 

    textarea = re.sub('.*', '', data, flags=re.MULTILINE) 
    print "processed '%s'" % textarea 

Приведенный выше код, по крайней мере, на моей машине не выводит следующее:

processed '' 

Это для обоих случаях, многострочный/не многострочный. Вместо этого одиночные кавычки распространяются по нескольким строкам. Почему это так?

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

Спасибо.

ОТВЕТ:

Как другие отметили. MULTILINE меня сбила с толку. Чтобы ответить на исходный вопрос, вместо моего желания точка не соответствовала новой строке, поэтому все заменялось пустой строкой, за исключением того, что строки новой строки в исходной строке были оставлены в покое.

Добавив флаг re.DOTALL в приведенный выше пример, вы получили ожидаемое поведение пустой строки.

+1

Это работает для меня. Для соответствия строкам, содержащим только ноль или более пробелов: '^ * $ \ n' – dsh

+0

Извините, ребята, я не понимал, что мой разрез и вставка удалили перерывы из назначения данных. Я снова редактирую сообщение, чтобы вернуть их обратно. – Bitdiot

+0

@Bitdiot, каков ваш ожидаемый результат? –

ответ

1

Что я действительно хочу сделать, это удалить пустые строки (строки, содержащие только ноль или больше пробелов) из многострочной строки.

re.sub(r'(?m)^[ \t]*$\n?', '', s) 

или

re.sub(r'(?m)^\s*$\n?', '', s) 

DEMO

+1

Могу ли я узнать причину. –

+0

(кстати, я этого не голосовал.) – Bitdiot

+0

Кстати, зачем вам «(? M)» в вашем ответе? – Bitdiot

Смежные вопросы