2015-04-20 58 views
1

路徑尾部的斜槓是這樣的:在應用re.sub

CLOUD_PATH = os.path.join(HOME, 'library', 'data') 
WORKDIR = os.getcwd() 

然後在腳本中,我有一個函數:

def urlchanger(src, dst):                 

    xmlsdir = os.path.join(src, 'Plugins', '_xmls', '')         

    xmlfiles = [ f for f in os.listdir(xmlsdir) if re.match(r'^.*\.xml', f)]    

    for file in xmlfiles:                 

     with open(os.path.join(xmlsdir, file), 'r+') as f:        
      indata = f.read()                             

      if ('dontchange.me' in indata):            
       outdata = re.sub(r'http://dontchange.me/', dst, indata)     
       print 'Updating file %s:\n \n%s' % (os.path.join(xmlsdir, file), outdata)            

       with open((os.path.join(os.environ['TEMP'], file)), 'w') as n:   
        n.write(outdata)              

與所謂:

urlchanger(WORKDIR, CLOUD_PATH) 

問題是, re.subdata目錄(來自out-file的結果)後執行不帶斜槓的替換:

plugin assemblyUrl="C:\library\dataSomefile.dll" 

之間dataSomefile - dataSomefile

我嘗試添加''CLOUD_PATH,如:

CLOUD_PATH = os.path.join(HOME, 'library', 'data', '') 

但得到了一個錯誤:

... 
    raise error, v # invalid expression 
sre_constants.error: bogus escape (end of line) 

而同樣爲一些其他的嘗試......

附:腳本從源文件中讀取數據,查找dontchange.me,用給定的URL替換它,並寫入新的新文件。 Python 2.7。

+2

'if('dontchange.me'in c for indata)''沒有做你想做的事。它創建一個生成器,然後測試它的布爾值,它是_always true_。你是否指「如果有(相同的生成器表達式)'?另外,看起來'indata'是一個字符串,所以'c'將會是一個字符,所以表達式在第一個地方沒什麼意義... –

+0

我認爲'dst'也被認爲是一個正則表達式,所以如果你在窗口中,並且在那裏有\等路徑分隔符,它們將在正則表達式中被解釋。你可以傳遞一個callable,只是返回'dst'。但是請顯示更完整的代碼示例! –

+0

@tobias_k是的,你是對的:-)'在c爲c in indata'從以前的編碼(我嘗試'readlines'第一,哪個返回列表')。謝謝你的提示。 – setevoy

回答

0

找到一個解決方案在這裏:Python how to replace backslash with re.sub()

所以,導致它:

if ('dontchange.me' in indata):           
    outdata = re.sub(r'http://dontchange.me/', dst + '\\\\', indata) 

但是,任何其他提示/勸讚賞。

+0

使用r'\\' - 那麼你不需要轉義字符 – M4ks

+0

@ M4ks'dst'是變量,在參數中傳遞 - 是否有可能在此使用它作爲原始字符串? – setevoy