Есть ли способ определить, сколько групп захвата содержится в данном регулярном выражении?
Я бы хотел сделать следующее:
def groups(regexp, s):
""" Returns the first result of re.findall, or an empty default
>>> groups(r'(\d)(\d)(\d)', '123')
('1', '2', '3')
>>> groups(r'(\d)(\d)(\d)', 'abc')
('', '', '')
"""
import re
m = re.search(regexp, s)
if m:
return m.groups()
return ('',) * num_of_groups(regexp)
Это позволяет мне делать такие вещи, как:
first, last, phone = groups(r'(\w+) (\w+) ([\d\-]+)', 'John Doe 555-3456')
Однако я не знаю, как реализовать num_of_groups
. (В настоящее время я просто работаю над этим.)
РЕДАКТИРОВАТЬ: Следуя совету от rslite , я заменил re.findall
на re.search
.
sre_parse
кажется наиболее надежным и комплексным решением, но требует обхода дерева и выглядит немного тяжелым.
Регулярное выражение MizardX, похоже, охватывает все основы, поэтому я собираюсь пойти на это.