忽略csv文件python中的括号

时间:2013-06-02 22:57:16

标签: python regex

我为朋友写了一个python脚本:

  1. 获取她正在编目的CSV照片,其中包含有序列表中的照片名称
  2. 查找文件系统上的图像文件
  3. 将csv中的文件与系统上的文件进行匹配
  4. 将文件系统上的图像复制到文件显示在CSV中的图形名称的文件夹
  5. 基本上,确实如此:


    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
    

    我尝试或考虑过:

    1. 更改文件名/ csv,但这不是可扩展的,理想情况下是她的 部门将来会更多地使用这个脚本
    2. 调查将文件视为“原始” - 但似乎并非如此 这可以从CSV
    3. 输入
    4. 从输入中删除[字符,但问题在于 然后输入将与系统上的实际文件不匹配。
    5. 我想我应该提一下我只是怀疑这是问题所在:通过打印代码的进度,看起来好像代码到达带有括号和错误的CSV项目。

1 个答案:

答案 0 :(得分:3)

相关代码是使用用户输入编写正则表达式的部分,而不对其进行清理。你不应该这样做。

我相信你根本不需要使用RE。你可以使用if item in pathpath.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)]