Подтвердить что ты не робот

Регулярное выражение Python, сопоставление шаблона по нескольким строкам.. почему это не работает?

Я знаю, что для синтаксического анализа я должен идеально удалить все пробелы и строки, но я просто делал это как быстрое решение для чего-то, что я пытался, и я не могу понять, почему он не работает. Я обернул различные области текст в моем документе с обертками типа "#### 1", и я пытаюсь разобрать на основе этого, но его просто не работает, независимо от того, что я пытаюсь, я думаю, что я использую многострочный код правильно.. любые советы приветствуются

Это не возвращает никаких результатов:

string='
####1
ttteest
####1
ttttteeeestt

####2   

ttest
####2'

import re
pattern = '.*?####(.*?)####'
returnmatch = re.compile(pattern, re.MULTILINE).findall(string)
return returnmatch
4b9b3361

Ответ 1

Попробуйте re.findall(r"####(.*?)\s(.*?)\s####", string, re.DOTALL) (тоже работает, конечно, с re.compile).

Это регулярное выражение вернет кортежи, содержащие номер раздела и содержимое раздела.

В вашем примере это вернет [('1', 'ttteest'), ('2', ' \n\nttest')].

(BTW: ваш пример не будет работать, для многострочных строк используйте ''' или """)

Ответ 2

Многострочный не означает, что . будет соответствовать возврату строки, это означает, что ^ и $ ограничены только строками

re.M re.MULTILINE

Если указано, символ шаблона '^' соответствует началу строки и в начале > каждой строки (сразу после каждой новой строки); и символ шаблона '$' > совпадает в конце строки и в конце каждой строки (непосредственно перед каждой > новой строкой). По умолчанию "^" соответствует только в начале строки и "$" только в конце конца строки и непосредственно перед новой строкой (если есть) в конце строки.

re.S или re.DOTALL делает . соответствие даже новым строкам.

Источник

http://docs.python.org/