Regex, который соответствует только тексту, который не является частью разметки HTML? (Python)

1

Как я могу создать совпадение шаблона, если он не находится внутри 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 явно ошибочен - я написал это быстро и не учитывал возможность угловых скобок в цитированных атрибутах (например, '< img alt= "next > " / > '). Он не учитывает <script> или <style> теги или комментарии.
Показать ещё 1 комментарий
Теги:

1 ответ

12

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

Просто используйте Beautiful Soup.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню