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

в тексте нужно найти первый попавшийся 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 

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

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

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

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

1 лайк

Поддержу @TIT вот этой ссылкой: Why is it such a bad idea to parse XML with regex? - Stack Overflow

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

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

1 лайк

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

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

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

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

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

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

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

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

.*

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

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

и последним

in-stock="true"

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

[^>]*
3 лайка

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

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