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

Итак, мой вопрос: как вы получаете доступ к нескольким групповым матчам?

Заранее спасибо за вашу помощь.

Том

  • Причина «всего» и «любого» результата в пустых списках
  • эффективный массив python для преобразования массива numpy
  • Как добавить пространство имен в атрибут в lxml
  • Удалите элементы при перемещении списка в Python
  • взвешенная ковариационная матрица в numpy
  • Python эквивалент которого () в R
  • Не удалось выполнить команду «x86_64-linux-gnu-gcc» с статусом выхода 1
  • Надежное обнаружение загрузки страницы или тайм-аута, Selenium 2
  • 2 Solutions collect form web for “Регулярные выражения Python: как получить доступ к нескольким совпадениям группы?”

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

    Обновить:

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

    Модуль regex исправляет это, добавляя метод .captures :

     >>> m = regex.match(r"(..)+", "a1b2c3") >>> m.captures(1) ['a1', 'b2', 'c3'] 
    Python - лучший язык программирования в мире.