2013-04-03 2 views
0

Я пытаюсь соответствовать регулярное выражение, которое разбирает ответ .....Регулярное выражение не соответствует re.match

error code|error text|submission reference 
2|missing or invalid fields|0 

он использует re.match(self.error_format)

Я попытался error_format как:

(?P<status_code>[0-9]+)|(?P<status_message>.+)|(?P<gateway_message_id>[a-zA-Z0-9-]+) 

но это соответствует строке error code|error text|submission reference не вторая строка по мере необходимости.

также попытался:

(?P<status_code>[0-9]+)\|(?P<status_message>.+)\|(?P<gateway_message_id>[a-zA-Z0-9-]+) 

, но это не соответствует вообще.

Update:

То, что я хочу сделать, это матч только 2 | отсутствует или недействительные поля | 0, но полный текст код ошибки | текст ошибки | ссылки на подчинение 2 | отсутствует или недействительные поля | 0 так как будто мне нужно пропустить первую часть.

т.е.

msg = re.match('(?P<status_code>[0-9]+)\|(?P<status_message>.+)\|(?P<gateway_message_id>[a-zA-Z0-9-]+)', 'error code|error text|submission reference 2|missing or invalid fields|0') 
+0

Я думаю, что главное, что висит вас (и, возможно, другие тоже), что 'match' только найти вещи прямо в начале текста разыскивается. Вам нужно использовать 'search', если то, что вы ищете, возможно, не в начале. –

+0

Хорошо, если бы ОП разделил линии и выполнил повторную линию, он бы работал так же хорошо, как и re.search. В противном случае re.finditer должен сделать трюк (я бы предположил, что в реальном файле журнала будет более одной соответствующей строки). –

ответ

2

Попытка не совпадать с сепаратором. Как это:

(?P<status_code>^[0-9][^|]*)\|(?P<status_message>[^|]+)\|(?P<gateway_message_id>.+) 
+0

Это тоже хороший момент, но я бы использовал его только во 2-й группе - в первой группе [0-9] все равно не совпадали бы и, вероятно, более специфично для формата ведения журнала OP. –

+0

кажется, что он по-прежнему соответствует только первой строке. Я хочу, чтобы он пропустил всю первую строку и только совпадал со вторым. – MarkO

+0

пропустить эту строку «код ошибки | текст ошибки | представление ссылки» это только заголовки – MarkO

2
msg = re.match('(?P<status_code>[0-9]+)\|(?P<status_message>[^|]+)\|(?P<gateway_message_id>[a-zA-Z0-9-]+)', '2|missing or invalid fields|0') 

матчи отлично, а затем вы можете получить доступ к отдельным частям с помощью msg.group('status_code')

Версии без \ также совпадает, но это будет только поймать «2» и выиграл 't заполните все три группы в примере вашей второй строки.

Если вы хотите запустить это на текст с несколькими линиями, вы можете сделать

matches = re.finditer('(?P<status_code>[0-9]+)\|(?P<status_message>[^|]+)\|(?P<gateway_message_id>[a-zA-Z0-9-]+)', s) 
for m in matches: 
    print m.group('status_code'), m.group('status_message'), m.group('gateway_message_id') 

или потом наоборот:

for line in youtext.split('\n'): 
    m = re.match(msg = re.match('(?P<status_code>[0-9]+)\|(?P<status_message>[^|]+)\|(?P<gateway_message_id>[a-zA-Z0-9-]+)', line) 
    if m: 
     print m.group('status_code'), m.group('status_message'), m.group('gateway_message_id') 

Я думаю, что охватывает все варианты и ни один из них будет соответствовать вашей первой строке, которая не имеет числового кода ошибки в первом разделе.

+0

thats, кажется, дает мне «код ошибки» текст ошибки | ссылка на отправку »совпадение, которое я хочу 2 | отсутствующие или недопустимые поля 0 – MarkO

+0

Не совсем уверен, что вы имеете в виду, но выше не вернется соответствие для re.match (' (? P [0-9] +) \ | (? P . +) \ | (? P [a-zA-Z0-9 -] +) ',' код ошибки | текст ошибки «ссылка на публикацию»), так что это должно быть именно то, что вы хотели. –

+0

см. Обновленный вопрос, надеюсь, что имеет смысл – MarkO

0
import re 

tests = '''\ 
error code|error text|submission reference 
2|missing or invalid fields|0'''.splitlines() 

for test in tests: 
    pat = r'''(?x) 
     (?P<status_code>[^|]+) 
     [|](?P<status_message>.+) 
     [|](?P<gateway_message_id>[\w\d-]+)''' 

    print(re.match(pat, test).groups()) 

дает

('error code', 'error text', 'submission') 
('2', 'missing or invalid fields', '0') 
Смежные вопросы