Поскольку (([A-D])[0-9]+)+
является группой повторных захватов , неудивительно, что возвращаются только результаты последнего матча.
Вы можете использовать Библиотека регулярных выражений PyPi (которую можно установить, набрав pip install regex
в консоли / терминале и нажав клавишу ВВОД), а затем используйте:
import regex
results = regex.finditer(r'SOME_STRING_(([A-D])[0-9]+)+_[A-Z]+', 'SOME_STRING_A2B2C3_OTK')
print( [zip(x.captures(1),x.captures(2)) for x in results] )
# => [[('A2', 'A'), ('B2', 'B'), ('C3', 'C')]]
Свойство match.captures
отслеживает все захваты.
Если вы можете использовать только re
, вам нужно сначала извлечь все свои совпадения, а затем запустить второе регулярное выражение для них, чтобы извлечь нужные вам части:
import re
tmp = re.findall(r'SOME_STRING_((?:[A-D][0-9]+)+)_[A-Z]+', 'SOME_STRING_A2B2C3_OTK')
results = []
for m in tmp:
results.append(re.findall(r'(([A-D])[0-9]+)', m))
print( results )
# => [[('A2', 'A'), ('B2', 'B'), ('C3', 'C')]]
См. Python демо