我有以下代碼:蟒蛇正則表達式麻煩
what = re.match("get|post|put|head\s+(\S+) ",data,re.IGNORECASE)
,並在數據變量讓我們說我有這樣一行:
GET some-site.com HTTP/1.0 ...
如果我停止調試器中的腳本,檢查什麼變量,我可以看到它只匹配GET。爲什麼它不符合some-site.com?
我有以下代碼:蟒蛇正則表達式麻煩
what = re.match("get|post|put|head\s+(\S+) ",data,re.IGNORECASE)
,並在數據變量讓我們說我有這樣一行:
GET some-site.com HTTP/1.0 ...
如果我停止調試器中的腳本,檢查什麼變量,我可以看到它只匹配GET。爲什麼它不符合some-site.com?
>>> re.match("(get|post|put|head)\s+(\S+) ",'GET some-site.com HTTP/1.0 ...',re.IGNORECASE).groups()
('GET', 'some-site.com')
>>>
正則表達式語言運算符優先級將head\s+(\S+)
作爲第4種選擇。括號中的@Mykola Kharechko的答案安排爲head
作爲第4個替代方案,並且\s+(\S+)
被追加到與組匹配的任何其他方案。
+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
它的工作原理,但你能解釋爲什麼我的版本不起作用?我只想捕捉第二個單詞。我知道我可以通過調用.group(1)來訪問它,但我爲什麼我的版本不起作用感到困惑。 – Geo 2009-03-03 12:42:46
「爲什麼1 + 2 + 3 + 4 * 100是406而不是1000」? http://www.amk.ca/python/howto/regex/regex.html#SECTION000510000000000000000。閱讀「|」性格及其優先性。 – tzot 2009-03-03 22:55:49