Регулярные выражения Python: как получить доступ к нескольким совпадениям группы? - программирование
Подтвердить что ты не робот

Регулярные выражения 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

4b9b3361

Ответ 1

Отбросьте * из своего регулярного выражения (так что он соответствует точно одному экземпляру вашего шаблона). Затем используйте либо re.findall(...), либо re.finditer (см. здесь), чтобы вернуть все совпадения.

Update:

Похоже, вы, по сути, создаете рекурсивный синтаксический анализатор . Для относительно простых задач синтаксического анализа довольно часто и вполне разумно делать это вручную. Если вы заинтересованы в решении библиотеки (например, если ваша задача синтаксического анализа может усложниться позже), посмотрите pyparsing.