Как удалить блоки, окруженные фигурными скобками, через python - PullRequest
1 голос
/ 24 декабря 2009

Пример текста: Строка -> содержимое тега rev (через lxml).

Я пытаюсь удалить {{BLOCKS}} внутри текста.

Я использовал следующее регулярное выражение для удаления простых однострочных блоков:

p = re.compile('\{\{*.*\}\}')
nonBracketedString = p.sub('', bracketedString)

Однако это не удаляет первый многострочный раздел в квадратных скобках в начале содержимого. Как можно удалить многострочные блоки в фигурных скобках?


EDIT:

Решение из ответа:

p = re.compile('\{\{*?.*?\}\}', re.DOTALL)
nonBracketedString = p.sub('', bracketedString)

Ответы [ 3 ]

2 голосов
/ 24 декабря 2009

Установить флаг точки.

p = re.compile('\{\{*.*?\}\}', re.DOTALL)
nonBracketedString = p.sub('', bracketedString)

В режиме по умолчанию . соответствует любому символу, кроме новой строки. Если указан флаг DOTALL, он соответствует любому символу, включая символ новой строки.

http://docs.python.org/library/re.html

Также вам понадобится не жадное совпадение в скобках: .*?

1 голос
/ 24 декабря 2009
>>> import urllib2
>>> import re
>>> s = "".join(urllib2.urlopen('http://en.wikipedia.org/w/api.php?action=query&prop=revisions&titles=Italian%20War%20of%201542-1546&redirects&rvprop=content&format=xml').readlines())
>>> p = re.compile('\{\{.*?\}\}', re.DOTALL)
>>> re.sub(p, '', s)
'<?xml version="1.0"?><api><query><redirects><r from="Italian War of 1542-1546" to="Italian War of 1542\xe2\x80\x931546" /></redirects><pages><page pageid="3719774" ns="0" title="Italian War of 1542\xe2\x80\x931546"><revisions><rev xml:space="preserve">\n\n\n\nThe \'\'\'Italian War of 1542\xe2\x80\x9346\'\'\' was a conflict late in the [[Italian Wars]], ...

Я сократил вывод здесь, но этого достаточно, чтобы убедиться, что он работает.

1 голос
/ 24 декабря 2009

Установите флаг точки - это позволяет. чтобы соответствовать символам новой строки.

p = re.compile('\{\{*.*\}\}', re.DOTALL)
nonBracketedString = p.sub('', bracketedString)
...