2012-09-12 6 views
7

Мое регулярное выражение не делает ничего для моей строки.python regular expression matching anything

питон

data = 'random\n<article stuff\n</article>random stuff' 
datareg = re.sub(r'.*<article(.*)</article>.*', r'<article\1</article>', data, flags=re.MULTILINE) 
print datareg 

я получить

random 
<article stuff 
</article>random stuff 

я хочу

<article stuff 
</article> 
+2

Aw, c'mon: Not [Cthulhu Parsing] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) снова , – pillmuncher

+0

@pillmuncher: для меня это выглядит неправильным HTML, поэтому я сомневаюсь, что анализатор HTML сможет работать с ним очень легко. – Blender

+0

@Blender: Я думаю, ты прав. Но подстановка, похоже, не является допустимым XML. Интересно, для чего нужно сломать XML? – pillmuncher

ответ

10

re.MULTILINE на самом деле не сделать свое регулярные выражения многострочным так, как вы хотите быть.

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

re.DOTALL делает:

Сделать '.' специальный символ соответствует любому символу на всех, включая символ новой строки; без этого флага, '.' будет соответствовать всем кроме a newline.

Изменение flags=re.MULTILINE к flags=re.DOTALL и ваш регулярное выражение будет работать.

+0

удивительный, отметит как правильно :) спасибо! – user1442957

+0

спас мой день! благодаря – silviomoreto