Regex, который соответствует только тексту, который не является частью разметки HTML? (Python) - PullRequest
1 голос
/ 31 декабря 2008

Как я могу сделать сопоставление с шаблоном, если он не внутри тега HTML?

Вот моя попытка ниже. У кого-нибудь есть лучший / другой подход?

import re

inputstr = 'mary had a <b class="foo"> little loomb</b>'

rx = re.compile('[aob]')
repl = 'x'

outputstr = ''
i = 0

for astr in re.compile(r'(<[^>]*>)').split(inputstr):
    i = 1 - i

    if i:
        astr = re.sub(rx, repl, astr)

    outputstr += astr

print outputstr

выход:

mxry hxd x <b class="foo"> little lxxmx</b>

Примечания:

  • Шаблон <[^>] *> для соответствия тегам HTML, очевидно, имеет недостатки - я написал это быстро и не учел возможность использования угловых скобок в атрибутах в кавычках (например, 'image" /> '). Он также не учитывает теги или комментарии или

1 Ответ

12 голосов
/ 31 декабря 2008

Поскольку вы все равно используете Python, на вашем месте я бы посмотрел на Beautiful Soup , который является парсером Python HTML / XML . Действительно, при написании собственного синтаксического анализатора возникает так много особых случаев и проблем, которые не стоят затраченных усилий. Ваше регулярное выражение станет неуправляемо большим и все равно не даст правильных результатов во всех случаях.

Просто используйте Красивый суп .

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