Многострочные регулярные выражения python
Как извлечь все символы (включая символы новой строки) до первого появления последовательности слов-переводчиков? Например, со следующим вводом:
текст ввода:
"shantaram is an amazing novel.
It is one of the best novels i have read.
the novel is written by gregory david roberts.
He is an australian"
И последовательность the
Я хочу извлечь текст из shantaram
в первое вхождение the
, которое находится во второй строке.
Выход должен быть -
shantaram is an amazing novel.
It is one of the
Я пробовал все утро. Я могу написать выражение для извлечения всех символов до тех пор, пока он не встретит определенный символ, но здесь, если я использую выражение типа:
re.search("shantaram[\s\S]*the", string)
Он не совпадает с новой строкой.
Ответы
Ответ 1
Вы хотите использовать параметр DOTALL
для сопоставления строк новой строки. Из doc.python.org:
re.DOTALL
Сделайте '.' специальный символ соответствует любому персонажу вообще, включая новую строку; без этого флага ". будет соответствовать чему угодно, кроме новой строки.
Демо:
In [1]: import re
In [2]: s="""shantaram is an amazing novel.
It is one of the best novels i have read.
the novel is written by gregory david roberts.
He is an australian"""
In [3]: print re.findall('^.*?the',s,re.DOTALL)[0]
shantaram is an amazing novel.
It is one of the
Ответ 2
Используйте это регулярное выражение,
re.search("shantaram[\s\S]*?the", string)
вместо
re.search("shantaram[\s\S]*the", string)
Единственное различие - "?". Используя "?" (Например, *?, +?), Вы можете предотвратить самое длинное совпадение.
Ответ 3
Решение, не использующее регулярное выражение:
from itertools import takewhile
def upto(a_string, stop):
return " ".join(takewhile(lambda x: x != stop and x != "\n".format(stop), a_string))