2014-01-23 106 views
1

爲什麼下一個代碼與單詞不匹配SELECT匹配組爲什麼存在但不匹配?

import re 

re_q = r'(\d{4})-(\d{2})-(\d{2})\s(\d{2}):(\d{2}):(\d{2})\.*\d*\+\d{2}\s|\s(SELECT).*' 

raw_q = "2014-01-23 15:28:32.993995+04 | SELECT query_start, query from pg_stat_activity WHERE state='active'" 

m = re.match(re_q, raw_q) 

for i in range(1, 8): 
    print "Group <{0}>: {1}".format(i, m.group(i)) 

輸出:

Group <1>: 2014 
Group <2>: 01 
Group <3>: 23 
Group <4>: 15 
Group <5>: 28 
Group <6>: 32 
Group <7>: None 
+0

也許你需要使用['re.findall'(http://docs.python.org/2/library/re.html#re.findall),因爲它匹配在[第二輪]中(http://regex101.com/r/bN9fH1)。 – HamZa

回答

3

docs

'|'

A | B,其中A和B可以是任意RE,創建一個規則的 表達式,它將匹配A或B.任意數量的RE 可以用'|'分隔。通過這種方式。這可以在 組內使用(見下文)。當目標字符串被掃描時,由'|'分隔的RE 從左到右嘗試。當一個模式 完全匹配時,該分支被接受。這意味着一旦A 匹配,B將不會被進一步測試,即使它會產生更長的整體匹配。換句話說,'|'運營商永遠不會貪婪 。 要與文字'|'匹配,請使用\ |,或將其放在一個 字符類中,如[|]中所示。

|意味着正則表達式語言OR。你也必須逃脫,\。所以,\s|\s應該是\s\|\s。固定,我拿到後

Group <1>: 2014 
Group <2>: 01 
Group <3>: 23 
Group <4>: 15 
Group <5>: 28 
Group <6>: 32 
Group <7>: SELECT