2009-03-03 164 views
1

我有以下代碼:蟒蛇正則表達式麻煩

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

,並在數據變量讓我們說我有這樣一行:

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

如果我停止調試器中的腳本,檢查什麼變量,我可以看到它只匹配GET。爲什麼它不符合some-site.com?

回答

3
 

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

它的工作原理,但你能解釋爲什麼我的版本不起作用?我只想捕捉第二個單詞。我知道我可以通過調用.group(1)來訪問它,但我爲什麼我的版本不起作用感到困惑。 – Geo 2009-03-03 12:42:46

+0

「爲什麼1 + 2 + 3 + 4 * 100是406而不是1000」? http://www.amk.ca/python/howto/regex/regex.html#SECTION000510000000000000000。閱讀「|」性格及其優先性。 – tzot 2009-03-03 22:55:49

4

正則表達式語言運算符優先級將head\s+(\S+)作爲第4種選擇。括號中的@Mykola Kharechko的答案安排爲head作爲第4個替代方案,並且\s+(\S+)被追加到與組匹配的任何其他方案。

1

+1 Mykola的回答和gimel的解釋。另外,你真的想用這個正則表達式嗎?正如你發現的那樣,它們並不像看起來那麼簡單。這是一個非正則表達式的方法:

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