1

を使用して、ファイル内の一部のコンテンツを現在の作業ディレクトリに置き換えようとしていますpython 3.3。私は持っています:

def ReplaceInFile(filename, replaceRegEx, replaceWithRegEx):
    ''' Open a file and use a re.sub to replace content within it in place '''
    with fileinput.input(filename, inplace=True) as f:
        for line in f:
            line = re.sub(replaceRegEx, replaceWithRegEx, line)
            #sys.stdout.write (line)
            print(line, end='')

そして私はそれを次のように使用しています:

ReplaceInFile(r'Path\To\File.iss', r'(#define RootDir\s+)(.+)', r'\g<1>' + os.getcwd())

残念ながら、私のパスはC:\ Tkbt \ Launchなので、取得する置換は次のとおりです。

#define RootDir C:  kbt\Launch

つまり、タブとして解釈\tされます。

したがって、Pythonにすべてをダブルエスケープするように指示する必要があるように見えますos.getcwd()。多分答えかもしれないと思い.decode('unicode_escape')ましたが、そうではありません。誰かが私を助けることができますか?

'\'「それぞれを見つける」ではない解決策があることを願っています'\\'

4

1 に答える 1

2

あなたは.replace('\\', '\\\\')私に頼らなければならないでしょう、それはあなたがこの仕事をするためにあなたがしなければならない唯一のオプションです。

  • エンコーディングを使用しunicode_escapeてASCIIから再度デコードするのがうまくいったら、それは良かったでしょう。

    replacepattern = r'\g<1>' + os.getcwd().encode('unicode_escape').decode('ascii')
    

    これはパスで正しいことをします:

    >>> print(re.sub(r'(#define RootDir\s+)(.+)', r'\g<1>' + r'C:\Path\to\File.iss'.encode('unicode_escape').decode('ascii'), '#define Root
    #define RootDir C:\Path\to\File.iss
    

    ただし、処理またはエスケープre.sub()しないため、既存の非ASCII文字では使用できません。\u\x

  • 文字列内の特殊文字をエスケープするために使用しないでくださいre.escape()。エスケープが多すぎます。

    >>> print(re.sub(r'(#define RootDir\s+)(.+)', r'\g<1>' + re.escape(r'C:\Path\To\File.iss'), '#define RootDir foo/bar/baz'))
    #define RootDir C\:\Path\To\File\.iss
    

    そこに注意してください\:

.replace()非ASCII文字を含む、機能する置換パターンのみが発生します。

>>> print(re.sub(r'(#define RootDir\s+)(.+)', r'\g<1>' + 'C:\\Path\\To\\File-with-non-
ASCII-\xef.iss'.replace('\\', '\\\\'), '#define Root
#define RootDir C:\Path\To\File-with-non-ASCII-ï.iss
于 2013-01-15T11:29:38.217 に答える