2013-01-15 97 views
1

我想用python 3.3替換當前工作目錄下的文件中的某些內容。我有:Python 3:我怎樣才能讓os.getcwd()和re.sub()一起玩呢?

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 \啓動,所以我得到的置換爲:

#define RootDir C: kbt\Launch 

ie ie interpreting \t as tab。

因此它看起來像我需要告訴python加倍逃脫從os.getcwd()一切。我想也許.decode('unicode_escape')可能是答案,但事實並非如此。有人可以幫我嗎?

我希望有一個解決方案不是「找到替換每個'\''\\'」。

+0

這不僅僅是os.getcwd() - 這是任何路徑。 re.escape()也不起作用,因爲它轉義了':' - C:\ Tkbt \啓動 – gremwell

+0

不能使用'/'而不是\? –

+0

@fp:'os.getcwd()'返回帶反斜槓的路徑。這不是路徑文字。 –

回答

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 
    

    但與現有的非ASCII字符,因爲re.sub()不處理\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 
+0

Urgle; 're.sub()'承諾解釋所有的轉義碼,但'\ xab'和'\ uabcd'不被解釋。 –

+0

好的,我們稱之爲最終版... –

+0

Darn。但至少它有效。 – gremwell