2014-01-23 3 views
1

Почему следующий код не совпадает со словом ВЫБЕРИТЕ?Почему подходящая группа существует, но на самом деле не соответствует?

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. Любое число REs может быть разделено символом '|' в этом случае. Это можно использовать внутри групп (см. Ниже). По мере сканирования целевой строки REs , разделенные символом '|' испробованы слева направо. Когда один шаблон полностью соответствует, эта ветка принимается. Это означает, что, как только 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 
Смежные вопросы