2015-07-01 1 views
0

Я хочу сделать питон скрипт, который искать:Глядя на выражение правой RE (питон)

<span class="toujours_cacher">(.)*?</span> 

Я использую этот RE:

r"(?i)\<span (\n|\t|)*?class=\"toujours_cacher\"(.|\n)*?\>(.|\n)*?\<\/span\>" 

Однако, в некоторых из моих страниц , я нашел этот вид выражения

<span class="toujours_cacher">* 
    <span class="exposant" size="1">*</span> *</span> 

поэтому я попытался это RE:

r"(?i)\<span (\n|\t|)*?class=\"toujours_cacher\"(.|\n)*?\>(.|\n)*?(\<\/span\>|\<\/span\>(.|\n)*?<\/span>)" 

это нехорошо, потому что когда нет промежутка между ними, он ищет следующий.

Мне нужно удалить контент между пролетом с классом «toujours_cacher». Есть ли способ сделать это с помощью одного RE?

Я буду рад услышать любые Ваши предложения :)

+6

Если вы разбираете HTML или XML, не пытайтесь использовать регулярное выражение. Взгляните на ETree, BeautifulSoup или на другую библиотеку разбора. –

+0

Это не делает то, что вы думаете: '(. | \ N) *'. Вам нужно узнать о классах персонажей и о том, где положить скобки вокруг групп захвата. –

+0

Для этого я могу использовать только «standart» python, это скрипт для людей, которые ничего не знают о программировании и кто не сможет установить модули. – whitefret

ответ

0

Это (доказуемо) невозможно с регулярными выражениями - они не могут соответствовать разделителей на произвольную глубину. Вместо этого вам нужно перейти к использованию фактического анализатора.

0

Пожалуйста, не используйте регулярное выражение для разбора HTML, так как оно не является регулярным. Вы можете использовать BeautifulSoup. Вот пример BeautifulSoup, который находит тег <span class="toujours_cacher">(.)*?</span>.

from bs4 import BeautifulSoup 

soup = BeautifulSoup(htmlCode) 
spanTags = soup.findAll('span', attrs={'class': 'toujours_cacher'}) 

Это возвращает список всех span тегов, которые имеют класс toujours_cacher.

+0

спасибо за ваш ответ, я думаю, мне нужно будет сделать заметку для установки BeautifulSoup – whitefret

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