Заменить их регулярное выражение круглыми скобками

Я пытаюсь скопировать файл,

>>> 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)

Но сначала необходимо заменить пробелы и круглые скобки, прежде чем открытая функция будет работать:

/ 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, во вложенном возврате _compile ( шаблон, флаги) .sub (repl, string, count) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", строка 244, в _compile Raise error, v # invalid выражение sre_constants.error: несбалансированная скобка

Правильно ли я заменяю скобки?

Кроме того, при использовании для этого re.escape () файл не возвращается правильно. Так что это не альтернатива.


person Alvin    schedule 13.08.2011    source источник
comment
Вы можете использовать shutil.copy (copy2 или copyfile) вместо системной команды cp , таким образом избегая, в первую очередь, необходимости уходить с пути.   -  person Marty    schedule 14.08.2011


Ответы (4)


( имеет особое значение в регулярных выражениях (группировка), вы должны избегать его:

originalFile = re.sub(r'\(',r'\(', originalFile)

или, поскольку вы не используете функции регулярного выражения для замены:

originalFile = re.sub(r'\(','\(', originalFile)
person Karoly Horvath    schedule 13.08.2011
comment
Это именно то, что я ищу !! - person Alvin; 15.08.2011

Регулярное выражение r'(' переводится как начало группы захвата. Вот почему Python жалуется.

Если все, что вы делаете, это заменяете пробелы и скобки, возможно, просто string.replace пойдем?

person arunkumar    schedule 13.08.2011
comment
+1 для string.replace (). Сделайте самое простое, что может сработать. - person Daniel Ralston; 14.08.2011
comment
Спасибо, string.replace работает хорошо, и сейчас я переключу свой стиль программирования на его использование. - person Alvin; 15.08.2011

В качестве альтернативы, если вы избегаете вызова оболочки (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)
person aid    schedule 13.08.2011

  1. Используйте shutil.copy для копирования файлов, а не для вызова системы.
  2. Используйте подпроцесс, а не os.system - он избегает вызова оболочки, поэтому не требует цитирования.
person Douglas Leeder    schedule 13.08.2011
comment
Спасибо @mwalsh и Дугласу, shutil.copy - это хорошо. Но устраняет проблему только в одной строке. Спасибо хоть. - person Alvin; 15.08.2011
comment
Вот где вам нужен подпроцесс. - person Douglas Leeder; 15.08.2011