2017-03-10 1 views
1

Ich bin neu im Regex-Bereich! Ich versuche die Gruppenfunktionalität zu verstehen. Hier ist mein string:re.groups() gib nichts zurück

** server can\'t find mywebdomain.com: NXDOMAIN 

Hier meine regex ist:

match = re.match('[*]{2}\s+server.*NXDOMAIN') 

Hier ist der Wert des Spiels ich in Debugger sehen:

match="** server can't find testweb.com: NXDOMA> 

So versuche ich, um zu sehen, Gruppen in diesem Regex.

match.groups() 

aber es gibt nichts für mich zurück, während ich erwarten würde, ein Tupel zu bekommen also verstehe ich nicht wirklich, warum es nichts zurückgibt?

+2

Ist 'NXDOMA>' ein Tippfehler? Deine Regex wird nicht mit dem Ausdruck übereinstimmen, der 'NXDOMAIN' hat –

+1

' match = re.match ('[*] {2} \ s + server. * NXDOMAIN') '- wo ist ein zweites Argument? – Dmitry

+2

Da es nichts passt – quikst3r

Antwort

1

Die Funktion .groups() gibt die Ergebnisse der Erfassungsgruppen eines übereinstimmenden regulären Ausdrucks zurück, die im Ausdruck durch (<expression>) gekennzeichnet sind.

In Ihrem Ausdruck [*]{2}\s+server.*NXDOMAIN sind in () keine Unterausdrücke enthalten, die eine Erfassungsgruppe erstellen würden. Daher ist .groups() immer leer, unabhängig davon, ob Sie positiv auf eine Übereinstimmung in Ihrer Zeichenfolge getestet haben, weil Sie keine Erfassungsgruppen in Ihrer RegEx definiert haben. Das andere Problem ist, dass Sie bei Ihrem Anruf an re.match() den Ausdruck angeben, mit dem Sie testen möchten, aber Sie übergeben nicht die Zeichenfolge, die Sie testen möchten ... Das Format des Anrufs lautet re.match(<expression>, <string>)


Wenn Sie wirklich erfassen Gruppen verwenden möchten Sie Ihren Ausdruck in () umgeben kann, und tun ...

match = re.match(r'([*]{2}\s+server.*NXDOMAIN)', '** server can\'t find mywebdomain.com: NXDOMAIN') 
print(match.groups()) 
# ("** server can't find mywebdomain.com: NXDOMAIN",) 

Dies führt eine tuple Ihrer Erfassungsgruppe Ergebnisse.

Die andere Option ist Ihren Ausdruck zu halten wie es ist, und stattdessen die re.findall Funktion benutzen, um Ihr Spiel zu bekommen ...

result = re.findall(r'[*]{2}\s+server.*NXDOMAIN', '** server can\'t find mywebdomain.com: NXDOMAIN') 
print(result) 
# ["** server can't find mywebdomain.com: NXDOMAIN"] 

... und es gibt einen Array mit allen im Test gefundenen Treffern Zeichenfolge.

0

Sie müssen eine einfangende Gruppe() in Ihrem Regex haben, um Übereinstimmungen in der Funktion groups() zu erfassen. Außerdem sollte die passende Zeichenfolge als zweites Argument an die Funktion match() übergeben werden. Der folgende Code sollte funktionieren.

import re 
m = re.match("([*]{2}\s+server.*NXDOMAIN)", 
    "** server can\'t find mywebdomain.com: NXDOMAIN") 
if m: 
    print(m.groups())