2009-05-22 6 views
3

これは私が半厄介な問題を持っています。正規表現のサブ問題

は、次のコードを取る:

import re 
str_to_be_subbed = r'somefile.exe -i <INPUT>' 
some_str = r'C:\foobar' 
s = re.sub(r'\<INPUT\>', some_str, str_to_be_subbed) 
print s 

を私はそれが私を与えると思うだろう:

somefile.exe -i C:\\foobar 

をしかし、その代わりに、それは私を与える:

somefile.exe -i C:♀oobar 

私は、\ fは知っていますエスケープ文字ですが、たとえこのようにしても、特殊文字をエスケープする必要があります。私はこれを行う場合でも:

print r'%s' % s 

をそれはまだ私にこれを与える:

somefile.exe -i C:♀oobar 

は、なぜそれがこれを行うのですか?そして、これを避ける最善の方法は何ですか?

忍者編集:私はsの値を見れば

それは次のとおりです。

'somefile.exe -i C:\x0coobar' 

の\ X0に\ Fターンをした理由。ああ。

編集:私はこれにコードを変更した場合

もう一つ質問、:

import re 
import os 
str_to_be_subbed = r'somefile.exe -i <INPUT>' 
some_str = os.path.abspath(r'C:\foobar') 
some_str 
s = re.sub(r'\<INPUT\>', some_str, str_to_be_subbed) 
print s 

は私を与える:

>>> import re 
>>> import os 
>>> str_to_be_subbed = r'somefile.exe -i <INPUT>' 
>>> some_str = os.path.abspath(r'C:\foobar') 
>>> some_str 
'C:\\foobar' 
>>> s = re.sub(r'\<INPUT\>', some_str, str_to_be_subbed) 
>>> print s 
somefile.exe -i C:♀oobar 

は今理由です。 os.path.abspathが\をエスケープするので。なぜまだ再暴れているのですか?

これは、ちょうど古いアプリケーションでランダムに切り取られたこの小さな問題の本当に小さな例です。私は実際に行くことができませんし、これをstring.replaceに変更するのは、一日を費やさずに設定を行うためです。

私は本当になぜこれをやっているのか不思議です。上記の問題。

答えて

3

\fフォームフィード文字です。それをエスケープし、それが動作します:

some_str = r'C:\\foobar' 

別の解決策:

s = re.sub(r'<INPUT>', some_str.encode("string_escape"), str_to_be_subbed) 
+0

ありがとうございました。 エンコードは驚くほど効果的です。 – UberJumper

3

正規表現を使用しないでください:

print str_to_be_subbed.replace("<INPUT>",some_str) 

documentationが言うように:

REPL缶を文字列か関数か。 が文字列の場合、その中にあるバックスラッシュエスケープ が処理されます。

あなたの例では、正規表現を必要としない
+0

文字列置換は使用できません。 正規表現を使用する必要があります。そうしないと、何百行ものelsesコードを変更/変更することになります。 – UberJumper

0

str.replace()使用:

>>> str_to_be_subbed.replace('<INPUT>',some_str) 
'somefile.exe -i C:\\foobar' 
>>> 
2

Pythonのドキュメントは

re.sub(パターン、REPL、文字列...と言って、カウント= 0、フラグ= 0) 文字列内のパターンの左端の重複しない出現を置き換えreplで置き換えて得られた文字列を返します。パターンが見つからない場合は、文字列は変更されずに返されます。 replは文字列または関数です。文字列の場合は、その中のバックスラッシュエスケープが処理されます。つまり、\ nは1つの改行文字に変換され、\ rは改行文字に変換されます。 \ jなどの不明なエスケープはそのまま残されます

これは 'C:♀oobar'を指定する理由です。

ただし、2番目の引数として関数を指定すると、バックスラッシュエスケープは変換されません。

したがって、次の試してください。..

>>>import re 
>>>str_to_be_subbed = r'somefile.exe -i <INPUT>' 
>>>some_str = r'C:\foobar' 
>>>s = re.sub(r'\<INPUT\>', lambda _:some_str, str_to_be_subbed) 
>>>print s 
somefile.exe -i c:\foobar