2015-04-20 82 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