Регулярное выражение Python подавляет \n

Я хочу использовать регулярное выражение в Python, которое читает текст, находит все экземпляры, в которых ‹ эмоция > разметка существует в том же предложении, что и ‹ местоположение > разметка, а затем позволяет печатать эти предложения в уникальной строке выходного файла:

import re
out = open('out.txt', 'w')

readfile = "<location> Oklahoma </location> where the wind comes <emotion> sweeping </emotion> down <location> the plain </location>. And the waving wheat. It can sure smell <emotion> sweet </emotion>." 

for match in re.findall(r'(?:(?<=\.)\s+|^)((?=(?:(?!\.(?:\s|$)).)*?\bemotion>(?=\s|\.|$))(?=(?:(?!\.(?:\s|$)).)*?\blocation>(?=\s|\.|$)).*?\.(?=\s|$))', readfile, flags=re.I):
    line = ''.join(str(x) for x in match)
    out.write(line + '\n')

out.close()

Проблема в том, что если я читаю файл, содержащий разрывы строк, регулярное выражение не работает:

import re
out = open('out.txt', 'w')

readfile = "<location> Oklahoma </location> where the wind \n comes <emotion> sweeping </emotion> down <location> the plain </location>. And the waving wheat. It can sure smell <emotion> sweet </emotion>." 

for match in re.findall(r'(?:(?<=\.)\s+|^)((?=(?:(?!\.(?:\s|$)).)*?\bemotion>(?=\s|\.|$))(?=(?:(?!\.(?:\s|$)).)*?\blocation>(?=\s|\.|$)).*?\.(?=\s|$))', readfile, flags=re.I):
    line = ''.join(str(x) for x in match)
    out.write(line + '\n')

out.close()

Есть ли способ изменить это регулярное выражение, чтобы оно не задыхалось при попадании \n? Я был бы очень признателен за любые советы, которые другие могут дать по этому вопросу.


person duhaime    schedule 20.06.2013    source источник
comment
Либо прочитайте файл как строки, либо удалите символ новой строки перед применением регулярного выражения.   -  person Andenthal    schedule 20.06.2013


Ответы (2)


Добавьте re re.S или re.DOTALL (это одно и то же) в флаги в вашем регулярном выражении. Это приведет к тому, что . также будет соответствовать новой строке. Таким образом, новое значение аргумента flags будет re.I | re.S.

person Andrew Clark    schedule 20.06.2013
comment
Спасибо, FJ! Я ценю объяснение! - person duhaime; 20.06.2013

Используйте re.DOTALL / re.S

flags = re.DOTALL | re.I
person Explosion Pills    schedule 20.06.2013