Подставьте скобки для их регулярного выражения - PullRequest
2 голосов
/ 14 августа 2011

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

>>> 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, сначала необходимо заменить пробелы и скобки:

/ Пользователи / alvinspivey / Документы / Рабочая область / 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) Файл "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", строка 244, в _compile поднять ошибку, v # неверное выражение sre_constants.error: несбалансированная скобка

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

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

Ответы [ 4 ]

2 голосов
/ 14 августа 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)
2 голосов
/ 14 августа 2011

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

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

2 голосов
/ 14 августа 2011

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

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

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

originalFile = re.sub(r'\(','\(', originalFile)
0 голосов
/ 14 августа 2011
  1. Используйте shutil.copy для копирования файлов вместо вызова системы.
  2. Используйте подпроцесс, а не os.system - он избегает вызова в оболочку, поэтому не нуждается в цитировании.
...