Python3 регулярное выражение не совпадает - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь использовать re.findall для сопоставления строки, но она ничего не совпадает:

>>> str = ''' description TESTE ONE Gi0/0/0\n ip vrf forwarding test\n ip address       xxx.xxx.xxx.xxx\n ip flow monitor fnf input\n ip flow monitor fnf output\n negotiation    auto\n cdp enable\n'''
>>> print(str)
     description TESTE ONE Gi0/0/0
     ip vrf forwarding test
     ip address xxx.xxx.xxx.xxx
     ip flow monitor fnf input
     ip flow monitor fnf output
     negotiation auto
     cdp enable
     >>> desc = re.findall(r'^ description (.*)$', str)
     >>> desc
         []"

В regex101.com тот же regex работает нормально.

Ответы [ 2 ]

0 голосов
/ 04 апреля 2020

Ответ, предоставленный ApproachingDarknessFi sh, является правильным, если вы пытаетесь сопоставить всю строку ввода, которая следует «описанию», как указано. Тем не менее, вы делаете findall, что настоятельно рекомендует вам искать несколько вхождений ^ description (.*)$, и поэтому вы подразумеваете, что якоря ^ и $ представляют начало и конец строк , а не начало и конец всей строки. Если это так, то вы не хотите использовать флаг re.DOTALL, а флаг re.M:

import re

str = ''' description TESTE ONE Gi0/0/0
 ip vrf forwarding test
 ip address       xxx.xxx.xxx.xxx
 ip flow monitor fnf input 
 ip flow monitor fnf output
 negotiation    auto
 cdp enable
 description another one thrown in for good measure!
'''
print(re.findall(r'^ description (.*)$', str, re.M))

Отпечатки:

['TESTE ONE Gi0/0/0', 'another one thrown in for good measure!']
0 голосов
/ 04 апреля 2020

Расхождение вызвано поведением символа точки (.). В синтаксисе регулярных выражений Python , . не соответствует символам новой строки по умолчанию, поэтому разрывы строк в ваших строках приводят к несоответствию группы (.*).

Поведение или . можно изменить, передав методу re.DOTALL методу:

re.findall(r'^ description (.*)$', str, re.DOTALL)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...