Регулярное выражение Python, сопоставление шаблона по нескольким строкам.. почему это не работает?
Я знаю, что для синтаксического анализа я должен идеально удалить все пробелы и строки, но я просто делал это как быстрое решение для чего-то, что я пытался, и я не могу понять, почему он не работает. Я обернул различные области текст в моем документе с обертками типа "#### 1", и я пытаюсь разобрать на основе этого, но его просто не работает, независимо от того, что я пытаюсь, я думаю, что я использую многострочный код правильно.. любые советы приветствуются
Это не возвращает никаких результатов:
string='
####1
ttteest
####1
ttttteeeestt
####2
ttest
####2'
import re
pattern = '.*?####(.*?)####'
returnmatch = re.compile(pattern, re.MULTILINE).findall(string)
return returnmatch
Ответы
Ответ 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/