Многострочные регулярные выражения 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))