2015-01-29 2 views
3

Я хочу удалить HTML комментарии из HTML текстаКак удалить HTML комментарии с помощью Regex в Python

<h1>heading</h1> <!-- comment-with-hyphen --> some text <-- con --> more text <hello></hello> more text 

должно привести:

<h1>heading</h1> some text <-- con --> more text <hello></hello> more text 
+0

Использование регулярных выражений на ограниченном, известном наборе HTML может быть уместным. Тем не менее, вы должны знать, что есть бесчисленные случаи, когда он сломается, и, как правило, не рекомендуется. – grc

+0

Связанные: http://stackoverflow.com/a/1732454/3001761 – jonrsharpe

+0

Почему downvotes на вопрос? Если вы работаете над «известным набором HTML», это был законный вопрос. –

ответ

2

Наконец придумал этот вариант:

re.sub("(<!--.*?-->)", "", t)

Добавление ? делает поиск не- жадный и не объединяет несколько тегов комментариев.

0

Вы могли бы попробовать это регулярное выражение <![^<]*>

+0

Ваше регулярное выражение слишком много соответствует - обратите внимание, что вопрос имеет пример «<-- con -->», который не является комментарием HTML. –

+0

@GregLindahl это регулярное выражение не соответствовало «<-- con -->» и возвратило результат в ожидании OP. – dragon2fly

+0

@GregLindahl Вы можете протестировать его здесь https://regex101.com/r/Tdf5In/1 – dragon2fly

3

Вы не должны игнорировать возврат каретки.

re.sub("(<!--.*?-->)", "", s, flags=re.MULTILINE) 
+0

Почему мы не должны удалять также возврат каретки? – Ethan

+0

Ответы huazhihao соответствуют комментариям, которые возвращают каретки в комментарии. В одном из других ответов отсутствуют флаги = re.MULTILINE –

+3

действительно должен быть 're.DOTALL', а не' re.MULTILINE'. Это 're.DOTALL', который соответствует' \ n' на '.' – fjsj

0

Не используйте регулярное выражение. Вместо этого используйте синтаксический анализатор XML, который в стандартной библиотеке более чем достаточен.

from xml.etree import ElementTree as ET 
html = ET.parse("comments.html") 
ET.dump(html) # Dumps to stdout 
ET.write("no-comments.html", method="html") # Write to a file 
+0

Хотя это хороший совет, производительность парсеров XML намного, гораздо медленнее, чем это регулярное выражение. –

0
html = re.sub(r"<!--(.|\s|\n)*?-->", "", html) 

re.sub в основном найти экземпляр соответствия и заменить вторым аргументами. Для этого случая <!--(.|\s|\n)*?--> соответствует чему-либо начинающему с <!-- и заканчивается -->. Точка и? означает что угодно, и \ s и \ n добавляют случаи комментария muti line.

+1

Добро пожаловать в [so]! Если бы ОП мог понять ваш код сам по себе, он, вероятно, не спросил бы. Пожалуйста, объясните, что он делает, чтобы он обеспечивал ценность для тех, кому нужно было бы искать регулярное выражение. – jpaugh

+0

Спасибо, что напомнили! – Shawn

Смежные вопросы