我正在尝试匹配解析响应的正则表达式.....
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')
答案 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')