2014-01-23 62 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