やりたいこと
文字列strが与えられていて、strから文字列の置換を用いてstr2のような文字列を生成したいのですが、どうやっても出来ませんでした。どうすれば実現できるでしょうか?
Python
1str = '\\x80\\x00\\x00\\x00\\x00\\x00\\xb0' 2str2 = '\x80\x00\x00\x00\x00\x00\xb0'
以下、奮闘の結果を記しますが、結構長いので最後まで読んで頂かなくても構いません。。。
試したこと1
- '\x'を'\x'で置き換える
Python
1str.replace('\\x', '\x') 2# SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-1: truncated \xXX escape
ググってもエラーの意味がよく分からなかった(position 0-1とはどこのこと?)のですが、文字列'\x'
で置き換えようとして、「そもそも文字列とは'\xXX'
の形式ですよ。'\x'
は文字列じゃないですよ」って怒られてると解釈しています。
'\\x'->'\x'
の置換で怒られるなら、'\\xXX'->'\xXX'
の置換をしよう。
Python
1str.replace('\\x00', '\x00') 2# '\\x80\x00\x00\x00\x00\x00\\xb0'
一応できたっぽい。でも、str2のようにするには
Python
1str.replace('\\x00', '\x00').replace('\\x80', '\x80').replace('\\xb0', '\xb0')
のように全パターン手動で置き換えないといけません。不格好だし、数が増えた時にツライので却下。
試したこと2
- strを文字列として扱ってるから
'\\x'->'\x'
の置換が出来ない。じゃあバイト列として扱おう。
Python
1byte = str.encode() 2# b'\\x80\\x00\\x00\\x00\\x00\\x00\\xb0' 3 4byte.replace(b'\\x', b'\x') 5# SyntaxError: (value error) invalid \x escape at position 0
またなんかエラー出てきた…
調べたのですが、\x
というのはそれ単体で、後ろの2文字を16進数として扱うためのエスケープ記号を表しているっぽい??
試したこと3
\\
を\
に置き換える- 文字列(str)じゃなくてバイト列を使う
- そもそも
\
ってエスケープ記号によく使われるので、これ単体での置換は面倒臭い事になりそうな気がしていて避けていましたが、今までがことごとくダメだったので試してみることに…
Python
1byte.replace(b'\\', b'\') 2# SyntaxError: EOL while scanning string literal
これもエラー文でググったのですが、最後のb'\'
の部分が\
のせいで'
(シングルクォーテーション)が閉じ記号として扱われていないそうで、エラー吐かれます。
では、シングルクォーテーションをエスケープしてみます。こうすればバイト列中の\\
は\
に置き換わってくれるはず。
Python
1byte.replace(b'\\\\', b'\\') 2# b'\\x80\\x00\\x00\\x00\\x00\\x00\\xb0
予想に反して全く置換がされません。
更に色々試していて、こんなことも起きました…
Python
1str.encode().replace(b'\\', b'') 2# b'x80x00x00x00x00x00xb0'
byte.replace(b'\\', b'\')
をした時は、第2引数のb'\'
の\
が'
のエスケープに使われて怒られたのに、今度はb'\\'
の\
はエスケープに使われていない…
この辺りで完全にお手上げ状態ですが、一応re
モジュールを読み込んで正規表現も色々試しましたが、結局うまく行きませんでした。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/01 23:39 編集
2016/05/01 23:51
2016/05/01 23:57
2016/05/02 00:09
2016/05/02 00:22
2016/05/02 00:36
2016/05/02 02:16