Регулярные выражения Python: как получить доступ к нескольким совпадениям группы?
Я собираю довольно сложное регулярное выражение. Одна часть выражения соответствует строкам, таким как "+ a", "-57" и т.д. A + или a, за которым следует любое количество букв или цифр. Я хочу совместить 0 или более строк, соответствующих этому шаблону.
Это выражение, которое я придумал:
([\+-][a-zA-Z0-9]+)*
Если бы я искал строку '-56 + a', используя этот шаблон, я бы ожидал получить два совпадения:
+ a и -56
Однако, я получаю только последнее совпадение:
>>> m = re.match("([\+-][a-zA-Z0-9]+)*", '-56+a')
>>> m.groups()
('+a',)
Посмотрев на документы python, я вижу следующее:
Если группа соответствует несколько раз, доступно только последнее совпадение:
>>> m = re.match(r"(..)+", "a1b2c3") # Matches 3 times.
>>> m.group(1) # Returns only the last match.
'c3'
Итак, мой вопрос: как вы получаете доступ к нескольким групповым совпадениям?
Заранее благодарим за помощь.
Tom
Ответы
Ответ 1
Отбросьте *
из своего регулярного выражения (так что он соответствует точно одному экземпляру вашего шаблона). Затем используйте либо re.findall(...)
, либо re.finditer
(см. здесь), чтобы вернуть все совпадения.
Update:
Похоже, вы, по сути, создаете рекурсивный синтаксический анализатор . Для относительно простых задач синтаксического анализа довольно часто и вполне разумно делать это вручную. Если вы заинтересованы в решении библиотеки (например, если ваша задача синтаксического анализа может усложниться позже), посмотрите pyparsing.
Ответ 2
Модуль regex
устраняет это, добавляя метод .captures
:
>>> m = regex.match(r"(..)+", "a1b2c3")
>>> m.captures(1)
['a1', 'b2', 'c3']