#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']
Это может усложниться, если внутренний шаблон не является чрезвычайно простым.