我为朋友写了一个python脚本:
基本上,确实如此:
INPUT:myphoto1.tiff,mypainting.jpeg,myphoto9.jpg,orderedlist.csv
OUTPUT:fig001.jpg,fig002.tiff,fig003.jpeg
此代码将在mac上运行。这很好用,除了我们遇到一些问题,其中一些文件(全部由同一位摄影师)都有1个括号,例如
myphoto[fromitaly.jpg
这似乎打破了我的正则表达式搜索:
相关代码:
orderedpaths = [path for item in target for path in filenames if re.search(item, path)]
其中文件名是系统上照片文件的列表,而目标是CSV中的列表。此代码应与CSV文件名(以及列表中的后续顺序)匹配,以提供系统上文件名的有序列表。
错误:
Traceback (most recent call last):
File "renameimages.py", line 43, in <module>
orderedpaths = [path for item in target for path in filenames if re.search(item, path)]
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 142, in search
return _compile(pattern, flags).search(string)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 244, in _compile
raise error, v # invalid expression
sre_constants.error: unexpected end of regular expression
我尝试或考虑过:
我想我应该提一下我只是怀疑这是问题所在:通过打印代码的进度,看起来好像代码到达带有括号和错误的CSV项目。
答案 0 :(得分:3)
相关代码是使用用户输入编写正则表达式的部分,而不对其进行清理。你不应该这样做。
我相信你根本不需要使用RE。你可以使用if item in path
或path.endswith(item)
或类似的东西找到匹配的字符串。
最好的选择是使用你的库:
from os.path import basename
orderedpaths = [ ... if basename(path) == item]
如果您坚持使用RE,则应使用re.escape()
:
orderedpaths = [path for item in target for path in filenames
if re.search(re.escape(item), path)]