Как настроить регулярное выражение Python?
У меня есть артикулы товаров 11-3233 и 11-8232-99, и я хочу, чтобы регулярное выражение распознавало эти артикулы, то есть вывод должен быть такой:
[('11-3233', '11-8232-99')]
Мой код:
r = '(([0-9]*)-([0-9]*)-([0-9]*))|(([0-9]*)-([0-9]*))'
re.findall(r, 'мне нужен товар 11-3233 и 11-8232-99')
Выполнив этот код у меня выводит:
[('', '', '', '', '11-3233', '11', '3233'),('11-8232-99', '11', '8232', '99', '', '', '')]
Как изменить код так, чтобы я получал только свои артикулы без лишних компонентов?
Ответы (2 шт):
Нашел решение! Убрал все круглые скобки и получил нужный ответ!
r = '[0-9]*-[0-9]*-[0-9]*|[0-9]*-[0-9]*'
re.findall(r, 'мне нужен товар 11-3233 и 11-8232-99')
([0-9]*)-([0-9]*) — * означает 0 или много совпадений. Т.е. их вообще может не быть, и в список может случайно попасть строка "-". Вместо звездочек, там должны быть + означающие «1 или больше»
r'\d+(?:-\d+){1,2}': \d — цифра (digit), + один или больше раз подряд, ?: — «не группа захвата», -\d+ тире и еще числа, {1,2} от 1 до 2 (включительно) штук.
import re
regex = r'\d+(?:-\d+){1,2}'
match = re.findall(regex, 'мне m-m нужен товар 11-3233 и 11-8232-99 1-1-1-1')
print( match ) # ['11-3233', '11-8232-99', '1-1-1']
Если случай с обрезанным 1-1-1 не предусматривался, можно взять r'\d+(?:-\d+)+' такую регулярку которая "съест" любые цепочки чисел, а из результатов отфильтровать те, в которых 1 или 2 -
Или, усложнить выражение r'(?<!\d-)\d+(?:-\d+){1,2}(?!-\d)' где (?<!) «negative lookbehind» и (?!) «negative lookahead», обеспечивают отбрасывание всего, что совпадает с исходной регуляркой, но имеет «хвост» в виде дополнительного числа с тире.
(вроде ручная фильтрация списка результатов будет приятнее, чем такие регулярки)