2016-04-08 2 views
-2

У меня есть следующее регулярное выражение, которое, кажется, работает нормально на regex101. Как вы можете видеть, мои четыре возможные комбинации совпадают.Действительное регулярное выражение, не работающее в python

Теперь, если я хочу реализовать это в python, я не получаю никакого совпадения, когда пытаюсь сопоставить строку, похожую на первую строку в строковом поле regex101 (строка с ничем после сетевого адреса). Вот код

import re 

l_side = 'ip prefix-list PL_FROM_7600 seq 40 permit 192.168.10.0/23' 

myregex = re.compile(r''' 
(ip\sprefix-list)\s 
(?P<prefnam>\w+)\s 
(?P<prefseq>seq\s\d+)\s 
(permit|deny)\s 
(?P<prefnet>(?:[0-9]{1,3}\.){3}[0-9]{1,3}\/[1-3]?\d)\s 
((?P<prefgele>ge\s\d{1,2}\sle\s\d{1,2})| 
(?P<prefge>ge\s\d{1,2})| 
(?P<prefle>le\s\d{1,2})|) 
''', re.VERBOSE) 
l_match = myregex.search(l_side) 

print(l_match.group('prefnam')) 
print(l_match.group('prefgele')) 

Здесь ошибка я получаю

Traceback (most recent call last): 
    File "./testing.py", line 19, in <module> 
    print(l_match.group('prefnam')) 
AttributeError: 'NoneType' object has no attribute 'group' 

если я удалю на следующие из регулярных выражений

((?P<prefgele>ge\s\d{1,2}\sle\s\d{1,2})| 
(?P<prefge>ge\s\d{1,2})| 
(?P<prefle>le\s\d{1,2})|) 

затем он работает.

Все, что я пытаюсь найти здесь, это существование gele или le или ge или ничего. Я также пробовал следующее без везения.

((?P<prefgele>ge\s\d{1,2}\sle\s\d{1,2})| 
(?P<prefge>ge\s\d{1,2})| 
(?P<prefle>le\s\d{1,2})|(.?)) 

Любая идея о том, что происходит здесь

EDIT1:

После Сэмюэл ответ я испытал, но это, кажется, что все дело не соответствуют

  1. IP-префикс-лист PL_FROM_7600 seq 10 разрешение 192.168.1.80/28
  2. ip префикс-лист PL_FROM_7600 seq 20 разрешение 192.168.1.80/28 ge 23 le 25
  3. IP-префикс-лист PL_FROM_7600 сл 30 Разрешение 192.168.1.80/28 GE 23
  4. IP-префикс-лист PL_FROM_7600 40 сл разрешения 192.168.1.80/28 ле 23

1 и 2 совпадают, но не 3 и 4

Я поправки Сэмюэл регулярное выражение для:

(ip\sprefix-list)\s 
(?P<prefnam>\w+)\s 
(?P<prefseq>seq\s\d+)\s 
(permit|deny)\s 
(?P<prefnet>(?:[0-9]{1,3}\.){3}[0-9]{1,3}(?:\/[1-3])?\d) 
((\s(?P<prefgele>ge\s\d{1,2}\sle\s\d{1,2}))| 
(\s(?P<prefge>ge\s\d{1,2}))| 
(\s(?P<prefle>le\s\d{1,2})))? 

Это, кажется, соответствуют все дело в настоящее время. Спасибо Сэму.

+0

Я уже проголосовал, интересно, что случилось с моим сообщением? – Fabou78

ответ

2

И с этим регулярным выражением?

import re 

l_side = 'ip prefix-list PL_FROM_7600 seq 40 permit 192.168.10.0/23' 

myregex = re.compile(r''' 
(ip\sprefix-list)\s 
(?P<prefnam>\w+)\s 
(?P<prefseq>seq\s\d+)\s 
(permit|deny)\s 
(?P<prefnet>(?:[0-9]{1,3}\.){3}[0-9]{1,3}(?:\/[1-3])?\d)(\s 
(?P<prefgele>ge\s\d{1,2}\sle\s\d{1,2})| 
(?P<prefge>ge\s\d{1,2})| 
(?P<prefle>le\s\d{1,2})|)? 
''', re.VERBOSE) 
l_match = myregex.search(l_side) 

print(l_match.group('prefnam')) 
#print(l_match.group('prefgele')) 

разн для

(?P<prefnet>(?:[0-9]{1,3}\.){3}[0-9]{1,3}\/[1-3]?\d) 

заменен

(?P<prefnet>(?:[0-9]{1,3}\.){3}[0-9]{1,3}(?:\/[1-3])?\d) 

и после того, как я заменить

\s 
((?P<prefgele>ge\s\d{1,2}\sle\s\d{1,2})| 
(?P<prefge>ge\s\d{1,2})| 
(?P<prefle>le\s\d{1,2})|) 

по

(\s 
(?P<prefgele>ge\s\d{1,2}\sle\s\d{1,2})| 
(?P<prefge>ge\s\d{1,2})| 
(?P<prefle>le\s\d{1,2})|)? 
+0

Хорошая добыча !.Это распространенный недостаток в онлайн-тестировщиках, таких как Regex101: вы не можете заставить их относиться к каждой строке так, как если бы это была отдельная строка, без конца строки в конце. Кстати, этот последний '|' теперь лишний, потому что закрывающая группа является необязательной. –

+0

спасибо за совет –

+0

Merci Samuel. Кажется, что он работает нормально, когда 'ge XX le XX', но когда' ge XX' или 'le XX', он не захватывает соответствующую группу. Также я понимаю изменения, внесенные вами в конец регулярного выражения, но я не получаю бит prefnet, где вы говорите «diff для вашего». Можете ли вы расходовать свое объяснение? – Fabou78

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