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

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

Это не возвращает результатов вообще:

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

####2   

ttest
####2'

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

Ответы [ 2 ]

23 голосов
/ 21 августа 2010

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

re.M re.MULTILINE

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

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

Источник

http://docs.python.org/

14 голосов
/ 21 августа 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...