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は必要に応じて 2 行目ではなく行に一致します。

も試しました:

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

3 に答える 3

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」のみをキャッチし、2 行目の例で 3 つのグループすべてを満たすことはありません。

これを複数行のテキストで実行したい場合は、次のことができます

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 に答える
2

セパレータを一致させないようにしてください。このような:

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