2016-08-03 5 views
0

今はファイルを文字列として取り込み、それらをjsonにフォーマットします。ファイルにはエスケープする\ r、\ n文字が含まれていますが、\\ rや\\ nのようにエスケープされた不正な文字がすでに存在するファイルにはjsonオブジェクトがあります。ですから、今は\ r \ nの文字を\\ r \\ nに置き換えたいのですが、その前に\\ r \\ nを付けてください。\python regex:既にエスケープされていない場合に限り、不正な文字をエスケープします

私はこれを以下に試してみましたが、なぜうまくいかないのか分かりません

re.sub(r'[^\][\n]', r'\\\\n', s) 

任意の提案があります。

答えて

3

あなたは正規表現を使用して、このようにそれを行うことができます:

import re          

data = 'Hello\r\nWorld\\r\\n'     
print(data)         

print('-'*20)         

data = re.sub(r'([^\\])\r', '\\1\\\\r', data) 
data = re.sub(r'([^\\])\n', '\\1\\\\n', data) 
print(data) 

出力:

Hello    
World\r\n   
-------------------- 
Hello\r\nWorld\r\n 

あるいは、わずかに異なるアプローチがこのようにそれを行うには、次のようになります。

data = 'Hello\r\nWorld\\r\\n'       
print(data)            

print('-'*20)           

data = data.replace('\r', '\\r') 
data = data.replace('\n', '\\n') 
print(data) 

出力:

Hello    
World\r\n   
-------------------- 
Hello\r\nWorld\r\n 
+0

それぞれの2番目の置換は何ですか? の文字をすべて置き換えたら、 '\\\ r' ==' 'という文字列は残っていないと思われます。 – turbulencetoo

+0

最初の答えがうまくいきました!ありがとう!正規表現のバージョン –

+0

を私のテストからあなたの文字列で試してみましょう。二重置換は必要ではありません。http://pastebin.com/v9DTn0hpを見てください。その理由は、ASCII 13のキャリッジリターンだけに影響を与える最初の置換がリテラルのバックスラッシュ(ASCII 92)に続くリテラルr(ASCII 114) – turbulencetoo

関連する問題