用括号替换它们的正则表达式

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 很好。但是,只解决了一行的问题。不过还是谢谢。 这就是你需要子流程的地方。

以上是关于用括号替换它们的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

怎么用正则表达式匹配小括号里内容(含括号)?

括号之间的Python正则表达式替换[重复]

SpannableStringBuilder 用正则表达式替换内容

如何用正则表达式把括号连同中括号里的字符去掉

如何使用正则表达式删除字符串中的括号符号

C#正则表达式指定替换