Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > Помогите с регулярным выражением


Автор: kulibinka 29.8.2008, 09:27
Добрый день.
Есть шаблоны вида

Код

<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>


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

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

Дивы? id наверно всё-таки

Автор: kulibinka 29.8.2008, 10:46
Да, class и id smile

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

Почти делает все как надо, только в случаях без кавычек (id=id1) захвачивает > (получается id=id1>) 

Автор: setq 29.8.2008, 23:42
Если хочешь сохранить душевное здоровье, никогда не разбирай xmlы regexpами) Попробуй какой-нибудь... ... elementtree (?)... например.

Автор: kulibinka 30.8.2008, 07:22
Я хочу регулярки немножко понять smile

Автор: kulibinka 31.8.2008, 12:05
* 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

Автор: izekia 26.9.2008, 16:46
class\s*=\s*('[^']*'|"[^"]*)
для класса

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

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

Добавлено через 1 минуту и 55 секунд
setq, а чем разбирать?
гарантии что HTML веллформд тебе никто не даст
можно конечно парсер под это дело написать, работать будет быстрее чем регулярка

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)