Grep ведет себя иначе, чем Online RegExp-Tester - PullRequest
1 голос
/ 08 марта 2020

Для небольшого арт-проекта мне нужно прочитать цены на акции из Yahoo финансирования. Источник html довольно сложный и длинный, но с помощью онлайн-тестировщика регулярных выражений я нашел регулярное выражение, которое должно привести к правильному выводу.

<span class\=\"Trsdu\(0\.3s\) Fw\(500\) Pstart\(10px\) Fz\(24px\)(\"| C\(\$dataGreen\)\"| C\(\$dataRed\)\") data-reactid\=\"35\">([-+]{0,1}\d*\.\d*) \((([-+]{0,1})\d*\.\d*)\%\)<\/span>

Вот небольшой фрагмент кода с результатом вложено в него:

<svg class="D(n) Cur(p)" width="24" style="fill:#000;stroke:#000;stroke-width:0;vertical-align:bottom;" height="24" viewBox="0 0 24 24" data-icon="search" data-reactid="29"><path d="M9 3C5.686 3 3 5.686 3 9c0 3.313 2.686 6 6 6s6-2.687 6-6c0-3.314-2.686-6-6-6m13.713 19.713c-.387.388-1.016.388-1.404 0l-7.404-7.404C12.55 16.364 10.85 17 9 17c-4.418 0-8-3.582-8-8 0-4.42 3.582-8 8-8s8 3.58 8 8c0 1.85-.634 3.55-1.69 4.905l7.403 7.404c.39.386.39 1.015 0 1.403" data-reactid="30"></path></svg></div></div></div><div class="My(6px) Pos(r) smartphone_Mt(6px)" data-reactid="31"><div class="D(ib) Va(m) Maw(65%) Ov(h)" data-reactid="32"><div class="D(ib) Mend(20px)" data-reactid="33"><span class="Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)" data-reactid="34">11,541.87</span><span class="Trsdu(0.3s) Fw(500) Pstart(10px) Fz(24px) C($dataRed)" data-reactid="35">-402.83 (-3.37%)</span><div id="quote-market-notice" class="C($tertiaryColor) D(b) Fz(12px) Fw(n) Mstart(0)--mobpsm Mt(6px)--mobpsm" data-reactid="36"><span data-reactid="37">At close:  5:44PM CET</span></div></div><!-- react-empty: 38 --></div></div></div></div></div><script>if (window.performance) {window.performance.mark && window.performance.mark('Lead-3-QuoteHeader');window.performance.measure && window.performance.measure('Lead-3-QuoteHeaderDone','PageStart','Lead-3-QuoteHeader');}</script></div><div data-reactid="29">

Моя проблема в том, что это регулярное выражение ведет себя иначе в онлайн-тестере, чем в egrep unter openwrt!

В онлайн-тестере это приводит к точно этот фрагмент:

<span class="Trsdu(0.3s) Fw(500) Pstart(10px) Fz(24px) C($dataGreen)" data-reactid="35">+50.32 (+0.17%)</span>

(с некоторыми дополнительными группами, отмеченными из-за дополнительных скобок в регулярном выражении)

Если я использую

egrep '<span class\=\"Trsdu\(0\.3s\) Fw\(500\) Pstart\(10px\) Fz\(24px\)(\"| C\(\$dataGreen\)\"| C\(\$dataRed\)\") data-reactid\=\"35\">([-+]{0,1}\d*\.\d*) \((([-+]{0,1})\d*\.\d*)\%\)<\/span>' stock.html

, я получаю абсолютно нет результат. ОК, в регулярном выражении должна быть ошибка. Давайте начнем с малого:

egrep '<span class' stock.html

дает мне много результатов.

egrep '<span class\=\"Trsdu\(0\.3s\) Fw\(500\)' stock.html

все еще приводит к некоторым строкам кода. Но

egrep '<span class\=\"Trsdu\(0\.3s\) Fw\(500\) Pstart' stock.html

ничего мне не дает! Niente! Нада! Даже

egrep '<span class\=\"Trsdu\(0\.3s\) Fw\(500\) ' stock.html

(обратите внимание на пустое место в конце регулярного выражения!) Не дает мне результата. И я понятия не имею, в чем разница между

egrep '<span class\=\"Trsdu\(0\.3s\) Fw\(500\)' stock.html

и

egrep '<span class\=\"Trsdu\(0\.3s\) Fw\(500\) Pstart' stock.html

с точки зрения регулярных выражений! Если с пробелом будет проблема, я уже не получу результатов с первым пробелом перед "Fw". Так почему же мое регулярное выражение терпит неудачу с этим вторым пробелом?

1 Ответ

0 голосов
/ 08 марта 2020

Скорее всего, это конкретное пустое пространство перед Pstart не нормальное пространство, а табуляция. Вы также должны использовать классы символов POSIX при использовании egrep. Попробуйте это:

egrep '<span[[:space:]]+class\=\"Trsdu\(0\.3s\)[[:space:]]+Fw\(500\)[[:space:]]+Pstart\(10px\)[[:space:]]Fz\(24px\)(\"|[[:space:]]+C\(\$dataGreen\)\"|[[:space:]]+C\(\$dataRed\)\")[[:space:]]+data-reactid\=\"35\">([-+]{0,1}[[:digit:]]*\.[[:digit:]]*)[[:space:]]\((([-+]{0,1})[[:digit:]]*\.[[:digit:]]*)\%\)<\/span>' stock.html
...