2016-09-12 12 views
1

から正規表現をお読みください。は、Python:私は以下のもののように、私は正規表現が含まれているマッピングを格納JSONファイルを持っているJSON

"F(\\d)": "field-\\\\1", 
"FLR[ ]*(\\w)": "floor-\\\\1", 

私はバックスラッシュをエスケープ標準に準拠するため、実際にすべき正規表現します\d,\wおよび\\1を含む。

このJSONをjson.load()で読み終えたら、結果の辞書を後処理して正しい正規表現を取得する必要があります。 \\\に置き換える必要があります。これには最高の方法は何ですか?

これまでのところ、私はre.sub()str.replace()の両方を試しましたが、いずれの場合も、変電所で単一のバックスラッシュを表す方法が明確ではありません。

例えば、私は次のように単一のバックスラッシュを生成しない理由を理解していない:それは単一のバックスラッシュを作るん

In [76]: "\\\\d".replace("\\\\", "\\") 
Out[76]: '\\d' 
+1

※*は単一のバックスラッシュを生成します。それは表示されている方法で、エスケープ文字ではないリテラルのバックスラッシュであることを明確にしています – jonrsharpe

答えて

1

- 表示されたときにそのバックスラッシュはエスケープされます。これは、エスケープされていない文字を明示的に表示できるように行われます。そうしないと、バックスラッシュが次の文字をエスケープするかどうかがわかりません。

これは、個々の文字を確認することによって実証することができます:使用生の文字列を:Pythonで正規表現を行うための

# In a terminal/REPL: 
>>>> "\\\\d".replace("\\\\", "\\")[0] 
'\\' 
>>>> "\\\\d".replace("\\\\", "\\")[1] 
'd' 
>>>> "\\\\d".replace("\\\\", "\\")[2] 
'd' 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IndexError: string index out of range 

一つのヒントを。文字列リテラルの最初の引用符の前にrを置くと、バックスラッシュは何もエスケープしません(終了引用符を除く)。 r"\n"は、"\\n"に相当する\nの2文字を含む文字列です。あなたがエスケープシーケンスを送る必要がある正規表現やその他のものを扱うとき、それらは非常に役に立ちます。参照:What exactly do “u” and “r” string flags do in Python, and what are raw string literals?

+0

意味がありますが、私はまだそれらの正規表現を機能させる問題があります。例えば:In [24]:re.sub( "F(\\ d)"、 "field - \\\\ 1"、 "F1") Out [24]: 'field - \\ 1'' –

+0

@NikolayDerkachそれはまさにそれと同じように働いているようです。その呼び出しは ''文字列 '' F1 '''に解決され、 '' F "'のすべての文字列に続いて ''フィールド ''と1つの数字の後にバックスラッシュと '' 1' ''を続けます。そして、それが何をしているのです。真ん中の引数は一度エスケープされるので、 're'は2つのバックスラッシュを見るので、もう一度エスケープして1つのバックスラッシュを生成します。あなたがグループ1を参照することを意図していれば、それは '' field - \\ 1 'になります。 –

+0

@NikolayDerkach Pythonでregexesを行うためのヒント:生の文字列を使用してください。文字列リテラルの最初の引用符の前に 'r'を置くと、バックスラッシュは何もエスケープしません(終了引用符を除く)。 'r" \ n "'は2つの文字を含む文字列で、バックスラッシュとnは '" \\ n "'に相当します。あなたがエスケープシーケンスを送る必要がある正規表現やその他のものを扱うとき、それらは非常に役に立ちます。私はこれを答えに編集しています。 –

関連する問題