正则表达式与re.match不匹配

时间:2013-04-03 20:58:37

标签: python regex

我正在尝试匹配解析响应的正则表达式.....

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-]+)

但这根本不匹配。

更新

我想要做的只是匹配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')

3 个答案:

答案 0 :(得分:2)

尽量不要与分隔符匹配。像这样:

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

答案 1 :(得分: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”并且不会填充第二行示例中的所有三个组。

如果要在包含多行的文本上运行此操作,可以执行

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')

我认为这涵盖了所有选项,并且它们都不匹配第一部分中没有数字错误代码的第一行。

答案 2 :(得分: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')