Я пытаюсь разобрать список элементов, удовлетворяющих регулярному выражению python
r'\A(("[\w\s]+"|\w+)\s+)*\Z'
это список, разделенный пробелами, за исключением того, что пробелы допускаются внутри строк в кавычках. Я хотел бы получить список элементов в списке (то есть элементов, сопоставленных с
r'("[\w\s]+"|\w+)'
часть. Так, например
>>> parse('foo "bar baz" "bob" ')
['foo', '"bar baz"', '"bob"']
Есть ли хороший способ сделать это с помощью Python Re?
Многие вещи не совсем работают. Например
>>> re.match(r'\A(("[\w\s]+"|\w+)\s+)*\Z', 'foo "bar baz" "bob" ').group(2)
'"bob"'
возвращает только последний из найденных совпадений. С другой стороны
>>> re.findall(r'("[\w\s]+"|\w+)', 'foo "bar baz" "bob" ')
['foo', '"bar baz"', '"bob"']
но он также принимает некорректные выражения, такие как
>>> re.findall(r'("[\w\s]+"|\w+)', 'foo "bar b-&&az" "bob" ')
['foo', 'bar', 'b', 'az', '" "', 'bob']
Так есть ли способ использовать исходное регулярное выражение и получить все элементы, которые соответствуют группе 2? Что-то вроде
>>> re.match_multigroup(r'\A(("[\w\s]+"|\w+)\s+)*\Z', 'foo "bar baz" "bob" ').group(2)
['foo', '"bar baz"', '"bob"']
>>> re.match_multigroup(r'("[\w\s]+"|\w+)', 'foo "bar b-&&az" "bob" ')
None
Редактировать: важно, чтобы я сохранил кавычки в выводе, поэтому я не хочу
>>> re.match_multigroup(r'\A(("[\w\s]+"|\w+)\s+)*\Z', 'foo "bar baz" "bob" ').group(2)
['foo', 'bar baz', 'bob']
потому что тогда я не знаю, цитировался Боб или нет.