Хотя я не рекомендую использовать Regex для разбора HTML (для этого есть библиотеки почти на каждом языке), это должно работать:
text = "<p><b> hello world </b></p>. I am playing <b> python </b>"
import re
pattern1 = re.compile(r'\<p>(.*?)\</p>')
pattern2 = re.compile(r'\<b>(.*?)\</b>')
replaced = re.sub(pattern1, r'<bold>\1</bold>', text)
replaced = re.sub(pattern2, r'<bold>\1</bold>', replaced)
Думаю, проблема в том, что Python использует группы.
Проверьте следующее, и вы поймете, что я имею в виду:
text = "<p><b> hello world </b></p>. I am playing <b> python </b>"
import re
pattern = re.compile(r'\<p>(.*?)\</p>|\<b>(.*?)\</b>')
for match in pattern.finditer(text):
print match.groups()
Вы увидите следующее:
('<b> hello world </b>', None) # Here captured the 1st group
(None, ' python ') # Here the 2nd ;)
И, в любом случае, примите во внимание, что сначала он соответствует тому, что находится между <p></p>
, поэтому он принял <b> hello world </b>
(что-то, что вы тоже хотите сопоставить) в качестве первого совпадения. Возможно, изменение порядка скомпилированных регулярных выражений в pattern
решит эту проблему, но может произойти обратное (имея <b><p> ... </p></b>
)
Хотелось бы предоставить больше информации, но я не очень хорош в регулярных выражениях с использованием Python. C # воспринимает их по-другому.
Edit:
Я понимаю, что вы, возможно, захотите сделать это с помощью регулярных выражений для целей обучения / тестирования, не знаю, но в рабочем коде я бы выбрал другую альтернативу (например, ту, что дал вам @Senthil) или просто использовал HTML Parser .