Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с регулярным выражением, найти и обработать class и div в шаблоне 
:(
    Опции темы
kulibinka
Дата 29.8.2008, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 20.11.2006

Репутация: 2
Всего: 4



Добрый день.
Есть шаблоны вида

Код

<SPAN CLass='class1' id=id1>value</span>
<span class = "class2">value</span>
<span id=id2>Тут большой див </div>
<span class = 'class3' id='id3'>value</span>
<div id='id4'>text</div>


Мне нужно вытянуть все классы и дивы для того, чтобы их заменить на свои.
Т.е. нужно вытянуть фразы
Код

CLass='class1'
id=id1
class = "class2"
id=id2
class = 'class3'
id='id3'
id='id4'


Для вытягивания нужна правильная регулярка. Ближе всего к правильной эта 
pattern = r"([\s][class|div]*[\s]*=.*[\s|>]*)"

Вот сам код для теста:

Код

pattern = r"([\s][class|div]*[\s]*=.*[\s|>]*)"
str = """<SPAN CLass='class1' id=id1>value</span>
<span class = "class2">value</span>
<span id=id2>Тут большой див </div>
<span class = 'class3' id='id3'>value</span>
<div id='id4'>text</div>"""

tokens = re.compile(pattern, re.UNICODE|re.I)
words = tokens.findall(str)
print "words: ", words


Но она ищет не до первого вхождения пробела или > после знака =, а до последнего > (не смотря на [\s|>]*).
Т.е. результат такой:
Код

        0        CLass='class1' id=id1>value</span>
        1        class = "class2">value</span>
        2        id=id2>big div</div>
        3        class = 'class3' id='id3'>value</span>
        4        id='id4'>text</div>


Подскажите пожалуйста правильную регулярку.

Это сообщение отредактировал(а) kulibinka - 29.8.2008, 09:27
PM MAIL   Вверх
Daevaorn
Дата 29.8.2008, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 9
Всего: 70



Цитата(kulibinka @  29.8.2008,  10:27 Найти цитируемый пост)
классы и дивы для того

Дивы? id наверно всё-таки
PM MAIL WWW   Вверх
kulibinka
Дата 29.8.2008, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 20.11.2006

Репутация: 2
Всего: 4



Да, class и id smile

Пока дошел до следующей регулярки:
pattern = r"([class|id]+[\s]*=[\s|'|\"]*.*?[\s|'|\"|>]{1})"

Почти делает все как надо, только в случаях без кавычек (id=id1) захвачивает > (получается id=id1>) 
PM MAIL   Вверх
setq
Дата 29.8.2008, 23:42 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Если хочешь сохранить душевное здоровье, никогда не разбирай xmlы regexpами) Попробуй какой-нибудь... ... elementtree (?)... например.
  Вверх
kulibinka
Дата 30.8.2008, 07:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 20.11.2006

Репутация: 2
Всего: 4



Я хочу регулярки немножко понять smile
PM MAIL   Вверх
kulibinka
Дата 31.8.2008, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 20.11.2006

Репутация: 2
Всего: 4



* r"(class)|(id)\s*=\s*['\"].*\3" 

Ошибка: 

Traceback (most recent call last):
  File "O:\!!!code\usefull\regular_expression\re\8.2.1.py", line 33, in ?
    tokens = re.compile(pattern, re.UNICODE|re.I)
  File "O:\kyxa\server3\usr\local\python\Lib\sre.py", line 180, in compile
    return _compile(pattern, flags)
  File "O:\kyxa\server3\usr\local\python\Lib\sre.py", line 227, in _compile
    raise error, v # invalid expression
sre_constants.error: bogus escape: '\\3'


Гы - пропал пост с этим советом smile

Это сообщение отредактировал(а) kulibinka - 31.8.2008, 12:07
PM MAIL   Вверх
izekia
Дата 26.9.2008, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 5.12.2007

Репутация: нет
Всего: 3



class\s*=\s*('[^']*'|"[^"]*)
для класса

id\s*=\s*('[^']*'|"[^"]*|\s*[^ ^>]*)
для ид

примитивно конечно, но должно работать

Добавлено через 1 минуту и 55 секунд
setq, а чем разбирать?
гарантии что HTML веллформд тебе никто не даст
можно конечно парсер под это дело написать, работать будет быстрее чем регулярка
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0778 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.