为什么匹配组存在但不匹配?

时间:2014-01-23 12:10:47

标签: python regex python-2.7

为什么下一个代码与单词 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

1 个答案:

答案 0 :(得分: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