0

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

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,所以我需要跳过第一部分。

IE

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

3 回答 3

2

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

 (?P<status_code>^[0-9][^|]*)\|(?P<status_message>[^|]+)\|(?P<gateway_message_id>.+)
于 2013-04-03T21:04:19.807 回答
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')

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

于 2013-04-03T21:06:39.007 回答
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')
于 2013-04-03T21:13:08.097 回答