2012-02-12 2 views
3

У меня возникли проблемы с поиском многострочного шаблона с использованием регулярного выражения. Вот пример многострочного строка:многострочное регулярное выражение

some command [first line]\n 
second line \n 
yes can have multiple lines\n 
\n 
something else that I do not care about. 

Вот что я пытался до сих пор:

>>> match = re.match(r"^(.+)\n((.*\n)*)\n",body,re.MULTILINE) 
>>> match.groups() 
('some command [first line]', 'second line \nyes can have multiple lines\n', 'yes can have multiple lines\n') 

Ищу match.group (1) и match.group (2), и я Я доволен ими, но это подталкивает меня к тому, что я получаю match.group(3), которого я не ожидаю (и делает это так, что мое регулярное выражение неверно).

Кроме того, я, кажется, не получают имени модели прав ..

match = re.match(r"^(.+)\n((?P<bd>.*\n)*)\n",body,re.MULTILINE) 
>>> match.group(bd) 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
NameError: name 'bd' is not defined 

Я прошел через Python Regular Expressions from Google, но очевидно, что я не получил полную картину еще.

ответ

3

Я правильно понял, что результат, который вы ожидаете, находится в группе 3 вместо group2?

Если это ваша проблема, вы можете сделать группы не-захват, поставив ?: на старте, как этот

re.match(r"^(.+)\n(?:(.*\n)*)\n",body,re.MULTILINE) 

При этом вы получите только две группы в результате.

Может быть, я вас неправильно, и вы хотите, чтобы избавиться от 3-й группы, а затем

re.match(r"^(.+)\n((?:.*\n)*)\n",body,re.MULTILINE) 

будет решение.

Именованные группы

Вы можете получить доступ к имени группы, как этот

m.group('bd') 

вам нужно дать group() либо целое число или строку в качестве аргумента, см MatchObject

Смежные вопросы