Иногда сталкивался с тем, что регулярные выражения в JavaScript не работали как задумывалось. Списывал это на глючный RegExp в JavaScript. Но вот опять в JS столкнулся с тем, что non-greedy оператор не работает. Проверил в Python - и там тоже не работает. В чём объяснение?
Задача - получить числа из последней колонки в таблице с помощью Regexp. Сначала выдрать их из html, а потом уже отфильтровать от мусора. Но выдрать не получается из-за непонятной работы нежадного оператора (строка html и регулярка сильно упрощены для наглядности):
//JavaScript
s = '<tr><td>11</td><td>22</td></tr><tr><td>33</td><td>44</td></tr>';
s.match(/\d+.+?<\/tr/g);
// Array [ "11</td><td>22</td></tr", "33</td><td>44</td></tr" ]
#Python
s = '<tr><td>11</td><td>22</td></tr><tr><td>33</td><td>44</td></tr>'
import re
re.findall( r'\d+.+?<\/tr', s )
# ['11</td><td>22</td></tr', '33</td><td>44</td></tr']
Как видим, Regex захватывает лишние колонки таблицы вместо того, чтобы брать минимальную подстроку, удовлетворяющую условию.
Ожидался результат:
[ '22</td></tr', '44</td></tr' ]
Вопрос не в том, чтобы помочь решить задачу (я её и сам костылями решу), а
в том, чтобы объяснить почему non-greedy оператор +?
не срабатывает?