Найти абзацы, удалить все теги, оставив только название
Задание:
С помощью регулярного выражения написать программу, которая ищет в
тексте все абзацы, удаляет теги и оставляет только текст:
Было:
<p> текст </p>
Стало:текст
Попытка решения:
import re
input_filename = "../progr.txt"
result_filename = "../result.txt"
input_file = open(input_filename, mode = 'r', encoding = "utf-8")
resultfile = open(result_filename, mode = 'w', encoding = "utf-8")
mytext = input_file.read()
lookfor = r'^(?:(?!^$)[\s\S])+$'
results = re.findall(lookfor, mytext)
rst = re.sub('^(?:(?!^$)[\\s\\S])+$','', results)
print(rst)
Получаю ошибку:
expected string or bytes-like object
Ответы (1 шт):
Автор решения: MaxU
→ Ссылка
Решение:
res = re.sub(r"<p>(.*?)</p>", r"\1", text, flags=re.S)
пояснения регулярного выражения: (.*?)
- круглые скобки обозначают группу захвата ("capturing group"), которую можно использовать в части замены обращаясь к содержимому группы по его порядковому номеру - пример:
r"\1". .- точка в регулярных выражениях имеет особый смысл - это шаблон для указания любого единичного символа- знак
*после точки обозначает мультипликатор, повторяющий предшествующий символ или группу ноль или более раз - знак
?после звездочки обозначает нежадный модификатор, указывающий что предыдущий символ/группа повторится ноль или один раз. Это нужно для того, чтобы в группу захвата попало содержимое только одного тега.
Таким образом выражение re.sub(r"<p>(.*?)</p>", r"\1", text, flags=re.S) будет заменять все найденные подстроки вида "<p>любой текст</p>" на содержимое тега.
PS если убрать знак вопроса из решения то в группу захвата попадет только одна подстрока от первого вхождения "<p>" до последнего вхождения "</p>":
In [72]: re.sub(r"<p>(.*)</p>", r"\1", "prefix <p>first</p>, middle, <p>second</p> suffix", flags=re.S)
Out[72]: 'prefix first</p>, middle, <p>second suffix'
вместо:
In [73]: re.sub(r"<p>(.*?)</p>", r"\1", "prefix <p>first</p>, middle, <p>second</p> suffix", flags=re.S)
Out[73]: 'prefix first, middle, second suffix'