Как правильно написать regex для xml\html?


(Vitaliy ) #1

в тексте нужно найти первый попавшийся sku id, с in-stock="true"

<sku id="(.+?)" title="(.+?)" value="(.+?)" default="false" in-stock="true"

не работает

<sku id="1689949376482547" title="3-6 mos" value="3-6" default="false" in-stock="false" reg-price="&lt;span class=&quot;reg-price-dollars&quot;&gt;$29.95&lt;/span&gt;" sale-price="&lt;span class=&quot;reg-price-dollars&quot;&gt;$24.99&lt;/span&gt;" db-sale-price="$24.99" b-price="&lt;span class=&quot;reg-price-dollars&quot;&gt;$14.99&lt;/span&gt;" promo-name="Includes Extra 40% Off" price-tiers="3"/><sku id="1689949376482548" title="6-12 mos" value="6-12" default="false" in-stock="false" reg-price="&lt;span class=&quot;reg-price-dollars&quot;&gt;$29.95&lt;/span&gt;" sale-price="&lt;span class=&quot;reg-price-dollars&quot;&gt;$24.99&lt;/span&gt;" db-sale-price="$24.99" b-price="&lt;span class=&quot;reg-price-dollars&quot;&gt;$14.99&lt;/span&gt;" promo-name="Includes Extra 40% Off" price-tiers="3"/><sku id="1689949376482549" title="12-18 mos" value="1218" default="false" in-stock="true" reg-price="&lt;span class=&quot;reg-price-dollars&quot;&gt;$29.95&lt;/span&gt;" sale-price="&lt;span class=&quot;reg-price-dollars&quot;&gt;$24.99&lt;/span&gt;" db-sale-price="$24.99" b-price="&lt;span class=&quot;reg-price-dollars&quot;&gt;$14.99&lt;/span&gt;" promo-name="Includes Extra 40% Off" price-tiers="3"/><sku id="1689949376482550" title="18-24 mos" value="1824" default="false" in-stock="false" reg-price="&lt;span class=&quot;reg-price-dollars&quot;&gt;$29.95&lt;/span&gt;" sale-price="&lt;span class=&quot;reg-price-dollars&quot;&gt;$24.99&lt;/span&gt;" db-sale-price="$24.99" b-price="&lt;span class=&quot;reg-price-dollars&quot;&gt;$14.99&lt;/span&gt;" promo-name="Includes Extra 40% Off" price-tiers="3"/><sku id="1689949376482551" title="2T" value="2T" default="false" in-stock="false" reg-price="&lt;span

Заранее спасибо!


(Александр Таранков) #2

в value пропущена открывающая кавычка


(Vitaliy ) #3

пропустил.... исправил, но и с ней не работает ((


(Сергей Блохин) #4

Уж сколкьо раз твердили миру...
Не используйте регулярные выражения для работы с XML/HTML.
Есть же большое количество парсеров на всех языках.


(Dmitriy Zverev) #5

Поддержу @TIT вот этой ссылкой: http://stackoverflow.com/questions/8577060/why-is-it-such-a-bad-idea-to-parse-xml-with-regex

Но из спортивного интереса:

import re

string = '<sku id="1689949376482547" title="3-6 mos" value="3-6" default="false" in-stock="true" reg-price= bla-bla-bla'
pattern = re.compile('<sku id="(.\d+)" (.*) in-stock="true"')
idf = re.findall (pattern,string)
print idf[0][0]

1689949376482547


(sidelnikovmike) #6

ну и еще достаточно простое решение - это просто через строки сделать.
разделить split'ом текст, чтобы остался массив строк типа "<sku ..... />"
ну и дальше для каждого проверять, если contains('in-stock="true"'), то по индексу выбирать из строки id.


(Сергей Блохин) #7

Похоже у вас парсер съел часть сообщения?


(Mykhailo Poliarush) #8

@sidelnikovmike да, потому что код надо правильно вставлять, в FAQ указаны примеры http://automated-testing.info/faq


(Mykhailo Poliarush) #9

ну это не эффективное решение, лучше через regexp


(sidelnikovmike) #10

@TIT @polusok неа, он ничего не съел. именно так я и писал. вы имели в виду наверное "...". Это я описал так примерный вид элементов массива. Ну то есть элменты будут равны по сути тэгам sku с их содержанием.


(Mykhailo Poliarush) #11

съел, съел, а выглядит нормально, потому что я ваш комментарий подправил smile


(sidelnikovmike) #12

надо же. а я и не заметил. прошу прощения


(Ruslan Semerenko) #13

Не сработает. Из-за жадности

.*

захватим все что между первым

<sku id="(.\d+)"

и последним

in-stock="true"

А правильно будет использовать

[^>]*

(Vitaliy ) #16

Большое спаcибо, @Keda и всем откликнувшимся! Все работает, сxватывает на лету. _)))

<sku id="(.\d+)"[^>]*in-stock="true"