2017-10-16 21 views
-1

正規表現を含む文字列をjson.dumpsで正しくエンコードする方法を知っている人はいますか?またはこれを正しく処理するjson.dumpsを使用しないJSONペイロードのデータをエンコードする別の方法がある場合は、例えばPythonエンコード文字列に正規表現が含まれている場合の特殊JSON文字?

import json 
MyString = 'regex "Network\sInformation:[\s\S]+?Workstation\sName:\t+(?<src_host>[^\r]+)"' 
data = {} 
data['MyString'] = MyString 
data['date'] = '2017-09-18T11:28:06' 
json_data = json.dumps(data) 
print json_data 

が生成されます:

{ 
    "date": "2017-09-18T11:28:06", 
    "MyString": "regex \"Network\\sInformation:[\\s\\S]+?Workstation\\sName:\t+(?<src_host>[^\r]+)\"" 
} 

をただし、APIの結果によって処理[^\\r]、あるべき、[^\r]が適切にエスケープされていないことに気づくでしょう解析エラーが発生しました。

最後に、私がここで構築していJSONペイロードはこれと同様の要求を、使用してWeb APIに提出されます。

requests.post(url, auth=(uname, passwd), data=json_data, headers=headers) 

注:私は単にの束を発行関数を作成すると考えられていますこれを手動でエンコードするコマンドを置き換えてください。これは現時点での私のプランBですが、私はこれを行うために利用できるソリューション/モジュールが既に存在することを願っています。

答えて

1

あなたの正規表現の定義は、JSON出力、欠陥ではありません。

>>> MyString = 'regex "Network\sInformation:[\s\S]+?Workstation\sName:\t+(?<src_host>[^\r]+)"' 
>>> MyString[-5:-4] 
'\r' 
>>> len(MyString[-5:-4]) 
1 
>>> print(MyString[-5:-4]) # produces an empty line 

あなたがキャリッジリターンではなく、別のバックスラッシュとr文字を定義しました。 Pythonはこの2つをエスケープシーケンスとして解釈しました。 JSONは、あまりにも\rとそのキャリッジリターンをエンコード:

>>> import json 
>>> chr(13) # ASCII code 13 is a carriage return 
'\r' 
>>> print(json.dumps(chr(13))) 
"\r" 

ではなく、リテラル生の文字列を使用します。

MyString = r'regex "Network\sInformation:[\s\S]+?Workstation\sName:\t+(?<src_host>[^\r]+)"' 

今、あなたは二つの別々の文字、\rあります

>>> MyString = r'regex "Network\sInformation:[\s\S]+?Workstation\sName:\t+(?<src_host>[^\r]+)"' 
>>> MyString[-6:-4] 
'\\r' 
>>> len(MyString[-6:-4]) 
2 
>>> print(MyString[-6:-4]) 
\r 

をし、これら2つの文字は、期待されるJSON出力を生成します:

>>> import json 
>>> print(json.dumps(MyString)) 
"regex \"Network\\sInformation:[\\s\\S]+?Workstation\\sName:\\t+(?<src_host>[^\\r]+)\"" 
+1

doh !!!ありがとうございました!それは完璧な意味合いがあり、すべてが世界で再び正しいです。 – user3246693

関連する問題