У меня есть несколько строк, которые я бы хотел заменить, но не понимаю, почему он не работает. По какой-то причине период в строке останавливает сопоставление для регулярного выражения.Период останавливает многострочное регулярное выражение в Python?
Моя строка:
s = """
[some_previous_text]
<start>
one_period .
<end>
[some_text_after]
"""
То, что я хотел бы закончить с:
s = """
[some_previous_text]
foo
[some_text_after]
"""
То, что я изначально пытался, но ничего не найдено:
>>> import re
>>> s = "<start>\none_period .\n<end>"
>>> print re.sub("<start>[^.]*<end>", "foo", s)
<start>
one_period .
<end>
Однако, когда я взял период, он работал нормально:
>>> import re
>>> s = "<start>\nno_period\n<end>"
>>> print re.sub("<start>[^.]*<end>", "foo", s)
foo
Кроме того, когда я ставлю <end>
тега до периода, она соответствует первому <end>
тегу:
>>> import re
>>> s = "<start>\n<end>\none_period .\n<end>"
>>> print re.sub("<start>[^.]*<end>", "foo", s)
foo
one_period .
<end>
Так что же здесь происходит? Почему период останавливает совпадение [^.]*
?
EDIT:
решаемые
я ошибочно думал, что каратного ^
был для согласования новой строки. Мне нужен был флаг re.DOTALL (как указано Amber). Вот выражение я теперь с помощью:
>>> import re
>>> s = "<start>\none_period .\n<end>"
>>> print re.sub("<start>.*<end>", "foo", s, flags=re.DOTALL)
foo
, если я использую '. *', Однако он ничего не соответствует (т. Е. 'Re.sub (". * "," foo ", s)'). Что было бы правильным выражением замещения? –
user749618
Если вы хотите, чтобы '.' соответствовал линиям, вам нужно использовать флаг' re.DOTALL'. http://docs.python.org/library/re.html#re.DOTALL – Amber
're.sub (". * "," foo ", s, flags = re.DOTALL)' работает! Большое спасибо. –
user749618