2008-08-17 11 views
11

Python正規表現と逆参照で文字列アンエスケープを実装しようとしていますが、うまく動作しないようです。私はそれが私が間違ってやっている何かだと確信していますが、私は何を把握することはできません...Python正規表現で文字列アンエスケープを実装する

>>> import re 
>>> mystring = r"This is \n a test \r" 
>>> p = re.compile("\\\\(\\S)") 
>>> p.sub("\\1", mystring) 
'This is n a test r' 
>>> p.sub("\\\\\\1", mystring) 
'This is \\n a test \\r' 
>>> p.sub("\\\\1", mystring) 
'This is \\1 a test \\1' 

私は\\ \と[文字] [文字]を交換したいのですが、Pythonで後方参照私がこれまで使ってきた他のすべての実装で行っているのと同じ規則に従っているようには見えません。誰かが光を当てることができるだろうか?

答えて

8

ではありません'2番目の例はありますか?

は2.5で、あなたが適用できるエンコードstring-escapeもあります:

>>> mystring = r"This is \n a test \r" 
>>> mystring.decode('string-escape') 
'This is \n a test \r' 
>>> print mystring.decode('string-escape') 
This is 
a test 
>>> 
3

まあ、私は理解している場合、

"\\n" == r"\n" 

>>> import re 
>>> mystring = r"This is \\n a test \\r" 
>>> p = re.compile(r"[\\][\\](.)") 
>>> print p.sub(r"\\\1", mystring) 
This is \n a test \r 
>>> 

が要求されたものです...あなたはRを逃したか、バックスラッシュを誤カウントしているかもしれないと思います。

私はより一般的な要求がこれです疑う:

>>> d = {'n':'\n', 'r':'\r', 'f':'\f'} 
>>> p = re.compile(r"[\\]([nrfv])") 
>>> print p.sub(lambda mo: d[mo.group(1)], mystring) 
This is \ 
a test \ 
>>> 

興味学生はまた、私たちのヒーローはあなたがからブートストラップされていない信頼コンパイラの危険を説明するために同様の例を使用することを特徴とするケン・トンプソンのReflections on Trusting Trust"を、お読みくださいあなた自身のマシンコード。

0

あなたは、結果文字列のPythonの表現によって騙されています。 Python式:

'This is \\n a test \\r' 

は、私はあなたが欲しいものだと思うの文字列

This is \n a test \r 

を表します。それぞれのp.sub()呼び出しの前に 'print'を追加して、文字列のPython表現の代わりに返される実際の文字列を出力してみてください。

>>> mystring = r"This is \n a test \r" 
>>> mystring 
'This is \\n a test \\r' 
>>> print mystring 
This is \n a test \r 
0

アイデアは私がエスケープされた文字列を読み込み、そして(あなたが最初の場所にするために、正規表現に頼る必要はありません特にパイソンから欠けている機能、)それをアンエスケープだろうということです。残念ながら、私はバックスラッシュによってだまされてないよ...

別の例示的な例:

>>> mystring = r"This is \n ridiculous" 
>>> print mystring 
This is \n ridiculous 
>>> p = re.compile(r"\\(\S)") 
>>> print p.sub('bloody', mystring) 
This is bloody ridiculous 
>>> print p.sub(r'\1', mystring) 
This is n ridiculous 
>>> print p.sub(r'\\1', mystring) 
This is \1 ridiculous 
>>> print p.sub(r'\\\1', mystring) 
This is \n ridiculous 

私は印刷にそれを欲しい何それは何アンダース

This is 
ridiculous 
0

マーク。 2番目の例では、最初に配列にスローされた各エスケープ文字を必要とし、エスケープシーケンスが配列内に存在しない場合はKeyErrorを生成します。文字列をエスケープする(またはグローバル配列を保持する)たびに、可能なエスケープシーケンスを列挙することは本当に悪い解決策です。 PHPに似ていますが、これはpreg_replace()の代わりにラムダを使用したpreg_replace_callback()です。この状況ではまったく必要ありません。

私はそれについてのディックとして出てくる場合は申し訳ありません、私は完全にPythonに欲求不満です。これはこれまで使用してきた他のすべての正規表現エンジンでサポートされています。なぜこれが機能しないのか理解できません。

ありがとうございます。 string.decode('string-escape')機能は私が最初に探していたものです。誰かが正規表現の逆参照問題の一般的な解決策を持っている場合は、投稿しても構わないと思います。

関連する問題