3

Python で正規表現を記述しようとしていますが、それに含まれる文字の 1 つは \001 文字です。\001 を文字列に入れてもうまくいかないようです。'string' + str(chr(1)) も試しましたが、正規表現はそれをキャッチしていないようです。神様の愛のために誰か助けてください、私は一日中これに苦しんでいます。

import sys
import postgresql
import re

if len(sys.argv) != 2:
    print("usage: FixToDb <fix log file>")
else:
    f = open(sys.argv[1], 'r')
    timeExp = re.compile(r'(\d{2}):(\d{2}):(\d{2})\.(\d{6}) (\S)')
    tagExp = re.compile('(\\d+)=(\\S*)\001')
    for line in f:
        #parse the time
        m = timeExp.match(line)
        print(m.group(1) + ':' + m.group(2) + ':' + m.group(3) + '.' + m.group(4) + ' ' + m.group(5));
        tagPairs = re.findall('\\d+=\\S*\001', line)
        for t in tagPairs:
            tagPairMatch = tagExp.match(t)
            print ("tag = " + tagPairMatch.group(1) + ", value = " + tagPairMatch.group(2))

これは入力の例です。読みやすくするために「\001」文字を「~」に置き換えました

15:32:36.357227 R 1 0 0 0 8=FIX.4.2~9=0067~35=A~52=20120713-19:32:36~34=1~49=PD~56=P~98=0~ 108=30~10=134

出力:

15:32:36.357227 R タグ = 8、値 = FIX.4.29=006735=A52=20120713-19:32:3634=149=PD56=P98=0108=3010=134

したがって、「\001」文字で停止しません。

4

3 に答える 3

2

chr(1)"\x01"うまくいくはず"\001"です。(chr(1)すでに文字列を返しているので、する必要はないことに注意してください。)あなたの例では、との両方str(chr(1))があるように見えるので、データの行に2つの文字がない限り機能しません。 "\001" chr(1)

正規表現は「それをキャッチしていないようだ」と言いますが、入力データの例を示していないため、理由を言うことは不可能です。

編集; わかりました、問題は とは何の関係もないようです\001。これは古典的な欲張り問題です。\S*tagExp 式の は文字に一致します\001(その文字は空白ではないため、 は行全体を飲み込んでいます。非貪欲にするために\S*使用します。\S*?

編集:他の人が指摘したように、バックスラッシュが間違っているようにも見えます. 正規表現では、バックスラッシュを二重にする問題に直面します。Python は独自の文字列エスケープ (\tタブや\n改行など) にバックスラッシュを使用しますが、正規表現では独自の目的 (\s空白など) にもバックスラッシュを使用します。"\001"通常の解決策は生の文字列を使用することですが、エスケープを使用したい場合はそれができません。timeExpただし、正規表現に生の文字列を使用できます。次に、他の正規表現で、バックスラッシュを 2 倍にします ( on を除き\001ます。これは、文字コードのエスケープとして解釈されるようにするためです)。

于 2012-07-30T18:40:11.637 に答える
1

\Sを含む空白以外の任意の文字である可能性がある値を一致させるために を使用する代わりに、 を使用しないで\001ください。[^\x01]\001

于 2012-07-30T19:20:23.917 に答える