regex help использование представленных групп - PullRequest
0 голосов
/ 02 июня 2010

Я пытаюсь сопоставить rc-update -s вывод в Python.

m = re.match(r"^\s*(\w+)\s*\|{\s*(\w+)\s*}*$", " network | level1 level2 leveln ")

но m всегда None

трудная часть для меня - заставить регулярное выражение соответствовать n уровням. Я думал, что использование {} * будет соответствовать n уровням, но как только я добавлю {}, ничего не будет совпадать.

спасибо.

Ответы [ 2 ]

1 голос
/ 02 июня 2010

Фигурные скобки ("{}") не делают то, что вы думаете, они делают, по крайней мере, в этом примере.

Вы, похоже, хотите, чтобы группа не соответствовала. С Python re синтаксис для этого (?:\s*(\w+)\s*), чтобы соответствовать вашему примеру.

С этим изменением вашего примера я получаю:

>>> m = re.match(r"^\s*(\w+)\s*\|(?:\s*(\w+)\s*)*$", " network | level1 level2 leveln ")
>>> m
<_sre.SRE_Match object at 0x00F217B8>
>>> m.groups()
('network', 'leveln')

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

>>> m = re.match(r"^\s*(\w+)\s*\|((?:\s*\w+\s*)*)$", " network | level1 level2 leveln ")
>>> m.groups()
('network', ' level1 level2 leveln ')
>>> m.groups()[1].strip().split()
['level1', 'level2', 'leveln']

Кстати, это похоже на то, что было бы намного проще разобрать без регулярных выражений. Как видите, регулярные выражения содержат много ошибок и очень быстро запутываются.

1 голос
/ 02 июня 2010

Здесь {} нечетны, они не являются метасимволами при использовании таким образом, в чем смысл, потому что в данный момент они пытаются сопоставить литерал {, и совпадение не удается.

Замените их на круглые скобки, и это будет работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...