Группы регулярных выражений Python: как мне получить все группы?

#python #regex

#python #регулярное выражение

Вопрос:

Я озадачен этим:

 >>> import re
>>> re.match(r"(?P<all>-(?P<one>w ))*","-ab-cde-fghi-jkl-mn").groups()
('-mn', 'mn')
>>> re.match(r"(?P<all>-(?P<one>w )*)","-ab-cde-fghi-jkl-mn").groups()
('-ab', 'ab')
  

Как мне получить список всех терминов, в идеале, таких как

 ["ab","cde","fghi","jkl","mn"]
  

но

 "-ab-cde-fghi-jkl-mn"
  

тоже нормально.

(Пожалуйста, обратите внимание, что я полностью осведомлен о str.split("-") . Это вопрос о том, re как сопоставить весь набор)

Комментарии:

1. В документах для match говорится: «Если ноль или более символов в начале строки соответствуют шаблону регулярного выражения, верните соответствующий объект match». Таким образом, ожидается только одно совпадение с двумя группами.

2. Если вы используете модуль регулярных выражений PyPI, вы можете получить доступ ко всем группам через .captures

Ответ №1:

С помощью re.findall()

Пример:

 s = "-ab-cde-fghi-jkl-mn"
re.findall(r'[a-z] ', s)
  

Вывод:

 ['ab', 'cde', 'fghi', 'jkl', 'mn']
  

Ответ №2:

По умолчанию в .NET все работает так, как вы хотите.

Однако Python это не поддерживает. Самое близкое поведение, которое вы могли бы получить в Python, было бы повторить совпадение с захваченной подстрокой:

 >>> match = re.match(r"(?P<all>(?:-(?P<one>w ))*)","-ab-cde-fghi-jkl-mn")
>>> re.findall(r"-(?P<one>w )", match.group("all"))
['ab', 'cde', 'fghi', 'jkl', 'mn']
  

Это может усложниться, если внутренний шаблон не является чрезвычайно простым.