2016-04-08 6 views
-2

Ich habe folgende Regex, die auf regex101 in Ordnung zu sein scheinen. Wie Sie sehen können, sind meine vier möglichen Kombinationen abgestimmt.Gültige Regex funktioniert nicht in Python

Jetzt, wenn ich dies in Python implementieren möchte, bekomme ich überhaupt keine Übereinstimmung, wenn ich versuche, eine Zeile ähnlich der ersten Zeile in Regex101 Zeichenfolge Feld (Zeile mit nichts nach der Netzwerkadresse). Hier ist der Code

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')) 

Hier wird der Fehler ich

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

wenn ich die Folowing aus der regex

((?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})|) 

dann entfernen es funktioniert.

Alles, was ich hier versuche, ist die Existenz von gele oder le oder ge oder nichts. Ich habe auch folgendes ohne Glück versucht.

((?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})|(.?)) 

Jede Idee, was hier vor sich geht

EDIT1:

Nach Samuel Antwort, die ich getestet habe, aber es scheint, dass alle Fall nicht

  1. IP-Präfix-Liste abgestimmt sind PL_FROM_7600 seq 10 Genehmigung 192.168.1.80/28
  2. IP-Präfix-Liste PL_FROM_7600 SEQ 20 Genehmigung 192.168.1.80/28 ge 23 le 25
  3. IP-Präfix-Liste PL_FROM_7600 seq 30 erlaubt 192.168.1.80/28 23 ge
  4. IP-Präfix-Liste PL_FROM_7600 seq 40 erlaubt 192.168.1.80/28 le 23

1 und 2 angepasst sind, aber nicht mehr als 3 und 4

ich habe geändert Samuel Regex:

(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})))? 

Es scheint jetzt alle Fall übereinstimmen. Danke Sam.

+0

Ich wurde bereits abgelehnt, ich frage mich, was ist falsch mit meiner Post? – Fabou78

Antwort

2

Und mit diesem Regex?

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')) 

das diff ist für

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

ersetzt durch

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

und nach ersetzen i

\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})|) 

von

(\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

Guter Fang !.Dies ist ein häufiger Mangel bei Online-Testern wie Regex101: Sie können nicht jede Zeile so behandeln, als wäre es eine eigenständige Zeichenfolge ohne Zeilenvorschub am Ende. Das letzte '|' ist übrigens überflüssig, da die umschließende Gruppe optional ist. –

+0

danke für die Beratung –

+0

Merci Samuel. Es scheint gut zu funktionieren, wenn "ge XX le XX", aber wenn "ge XX" oder "le XX" ist, erfasst es nicht die entsprechende Gruppe. Auch verstehe ich die Änderung, die Sie am Ende der Regex vorgenommen haben, aber ich bekomme nicht das 'Prefnet' Bit, wo Sie sagen" das Diff ist für Sie ". Kannst du auf deine Erklärung verzichten? – Fabou78