2009-03-03 12 views
1

Ich habe den folgenden Code:python regex Probleme

what = re.match("get|post|put|head\s+(\S+) ",data,re.IGNORECASE)

und in den Daten Variable lassen Sie uns sagen, ich habe diese Zeile:

GET some-site.com HTTP/1.0 ...

Wenn ich das Skript im Debugger zu stoppen, und inspizieren Sie die was Variable, kann ich sehen, es nur gepaart GET. Warum passt es nicht zu some-site.com?

Antwort

3
 

>>> re.match("(get|post|put|head)\s+(\S+) ",'GET some-site.com HTTP/1.0 ...',re.IGNORECASE).groups() 
('GET', 'some-site.com') 
>>>                       
 
+0

Es funktioniert, aber können Sie bitte erklären, warum meine Version nicht funktioniert? Ich möchte nur das zweite Wort erfassen. Ich weiß, dass ich darauf zugreifen kann, indem ich .group (1) aufruft, aber ich bin verwirrt, warum meine Version nicht funktioniert hat. – Geo

+0

"Warum 1 + 2 + 3 + 4 * 100 ist 406 und nicht 1000"? http://www.amk.ca/python/howto/regex/regex.html#SECTION000510000000000000000. Lies über das "|" Charakter und seine Priorität. – tzot

4

Regex Sprache Operatorpräzedenz setzt head\s+(\S+) als vierte Alternative. Die Klammer in @Mykola Kharechko 's Antwort arrangieren für head als die vierte Alternative, und \s+(\S+) wird an welche Alternative auch immer die Gruppe angefügt.

1

+1 Mykola's Antwort und Gimels Erklärung. Möchtest du wirklich Regex dafür benutzen? Wie Sie herausgefunden haben, sind sie nicht so einfach wie sie aussehen. Hier ist eine nicht-Regex-basierte Methode:

def splitandpad(s, find, limit): 
    seq= s.split(find, limit) 
    return seq+['']*(limit-len(seq)+1) 

method, path, protocol= splitandpad(data, ' ', 2) 
if method.lower() not in ('get', 'head', 'post', 'put'): 
    # complain, unknown method 
if protocol.lower() not in ('http/1.0', 'http/1.1'): 
    # complain, unknown protocol 
+0

Ja, ich weiß, ich hätte Split verwenden können. Ich fing mit einer Regex an und wurde dann wütend, dass es nicht funktionierte :) – Geo