2013-09-22 3 views
10

Как извлечь все символы (включая символы новой строки) до первого появления последовательности слов-переводчиков? Например, при следующем входе:python multiline regular expressions

ввод текста:

"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) 

Это не соответствует всей строке.

+0

Вы пробовали что-нибудь? –

+1

«Вопросы, требующие кода, должны демонстрировать минимальное понимание решаемой проблемы. Включите попытки решения, почему они не работают, и ожидаемые результаты« – zero323

+0

, которые я пытался с утра. Я могу написать выражение для извлечения всех символов до тех пор, пока он не встретит определенный символ. Но здесь, если я использую выражение типа: re.search ("shantaram [\ s \ S] * the", string) , он не работает как часть [\ s \ S], и извлечение не происходит – AKASH

ответ

23

Вы хотите использовать опцию 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 
0

Раствор не используется регулярное выражение:

from itertools import takewhile 
def upto(a_string, stop): 
    return " ".join(takewhile(lambda x: x != stop and x != "\n".format(stop), a_string)) 
5

Используйте это регулярное выражение,

re.search("shantaram[\s\S]*?the", string) 

вместо

re.search("shantaram[\s\S]*the", string) 

Единственное отличие: «?». Используя «?» (Например, * ?, +?), Вы можете предотвратить самое длинное совпадение.

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