用括号替换它们的正则表达式
Posted
技术标签:
【中文标题】用括号替换它们的正则表达式【英文标题】:Substitute parenthesis for their regular expression 【发布时间】:2011-10-26 14:18:06 【问题描述】:我正在尝试复制文件,
>>> originalFile = '/Users/alvinspivey/Documents/workspace/Image_PCA/spectra_text/HIS/jean paul test 1 - Copy (2)/bean-1-aa.txt'
>>> copyFile = os.system('cp '+originalFile+' '+NewTmpFile)
但必须先替换空格和括号才能使 open 函数起作用:
/Users/alvinspivey/Documents/workspace/Image_PCA/spectra_text/HIS/jean\ paul\ test\ 1\ -\ Copy\ \(2\)/bean-1-aa.txt
空格 ' ' --> '\ ' 括号 '(' --> '\(' 等。
替换空格的工作:
>>> originalFile = re.sub(r'\s',r'\ ', os.path.join(root,file))
但括号返回错误:
>>> originalFile = re.sub(r'(',r'\(', originalFile)
Traceback(最近一次调用最后一次): 文件“”,第 1 行,在 文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py”,第 151 行,在子 return _compile(pattern, flags).sub(repl, string, count) _compile 中的文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py”,第 244 行 raise error, v # 无效表达式 sre_constants.error:括号不平衡
我是否正确替换了括号?
此外,当为此使用 re.escape() 时,文件不会正确返回。所以它不是替代品。
【问题讨论】:
您可以使用shutil.copy(copy2,或copyfile)代替系统cp命令,从而避免一开始就需要转义路径。 【参考方案1】:(
在正则表达式中有特殊含义(分组),必须转义:
originalFile = re.sub(r'\(',r'\(', originalFile)
或者,因为您不使用正则表达式功能进行替换:
originalFile = re.sub(r'\(','\(', originalFile)
【讨论】:
这正是我要找的!!【参考方案2】:正则表达式r'('
被翻译为启动捕获组。这就是 Python 抱怨的原因。
如果您所做的只是替换空格和括号,那么也许只需要string.replace 就可以了吗?
【讨论】:
+1 表示 string.replace()。 “做可能可行的最简单的事情”。 谢谢,string.replace 效果很好,我现在就转换我的编程风格来使用它。【参考方案3】:或者,如果您避免调用 shell (os.system) 进行复制,则无需担心转义空格和其他特殊字符,
import shutil
originalFile = '/Users/alvinspivey/Documents/workspace/Image_PCA/spectra_text/HIS/jean paul test 1 - Copy (2)/bean-1-aa.txt'
newTmpFile = '/whatever.txt'
shutil.copy(originalFile, newTmpFile)
【讨论】:
【参考方案4】:-
使用 shutil.copy 复制文件,而不是调用系统。
使用 subprocess 而不是 os.system - 它避免调用 shell,因此不需要引用。
【讨论】:
感谢@mwalsh 和 Douglas,shutil.copy 很好。但是,只解决了一行的问题。不过还是谢谢。 这就是你需要子流程的地方。以上是关于用括号替换它们的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章