0

問題は次のとおりです。
私は file.read(100) を実行しており、次のような行のようなものを取得しています:

line='1\x01\x1e17=00000000\x1e54=80300A00\x1e50=1\x1e56=2008080106010414\x1c\x1e247=CD\x1e6=In\x1e5=Boot\x1e180=0.445\x1e179=0.380\x1e55=AAA\x1e57=2008080100000000\x1e212=5000\x1e213=20000\x1e115=500\x1d\x1e29=5T2lqZHNAwg=\x01\x1e17=00000000'

私がやりたいのは、この行で 16 進数を検索し、それらを変換して、新しく操作された行を出力することです。
だから本質的に私はやりたいと思います:

t=re.findall(r'[\x80-\xff]', line) #Somehow get the positions    
for i in t: ord(i) #Something to this effect to replace all the hexadecimals it finds  

私が持っている t のコードを使用すると、行内のすべての文字はもちろん、その位置もわかりません。
この問題にどのようにアプローチするのが最善かについて誰かが考えているかどうか疑問に思っていました. ありがとう。

4

2 に答える 2

1

\xはエスケープされたxであり、これは無効なエスケープです。問題は正規表現ではなく、エンコーディングlineです。文字列ではありません。試してみるprintline、次のように表示されます。

117=0000000054=80300A0050=156=2008080106010414247=CD6=In5=Boot180=0.445179=0.38055=AAA57=2008080100000000212=5000213=20000115=50029=5T2lqZHNAwg=17=00000000

おそらく、これはあなたが必要とするものです。つまり、16進値はそのままで問題ありません。

この後も16進値を取得したい場合は、次rのように文字列の先頭にを追加する必要があります。

line=r'1\x01\x1e17=00000000\x1e54=80300A00\x1e50=1\x1e56=2008080106010414\x1c\x1e247=CD\x1e6=In\x1e5=Boot\x1e180=0.445\x1e179=0.380\x1e55=AAA\x1e57=2008080100000000\x1e212=5000\x1e213=20000\x1e115=500\x1d\x1e29=5T2lqZHNAwg=\x01\x1e17=00000000'

文字列リテラルにするため。正規表現は、他の文字列と同じようにリテラルを処理する必要があります。

于 2012-11-29T21:37:38.713 に答える
0

\x文字のすべてのインデックス(および[0]と[len(t)-1]を見つけることができます。次にord(t[i:i+1])、len(t)のiのように、そのリストを反復処理し、2つのペアでスライスします。

于 2012-11-29T21:20:41.157 に答える