【问题标题】:Python Regex to match a file in a list of files (getting error)Python Regex 匹配文件列表中的文件(出现错误)
【发布时间】:2010-02-26 19:17:45
【问题描述】:

我正在尝试在 Python 中使用正则表达式将文件(保存为字符串,即“/volumes/footage/foo/bar.mov”)与我创建的包含文件列表的日志文件匹配。但是当我运行脚本时,它给了我这个错误:sre_constants.error: unbalanced parenthesis。我使用的代码是这样的:

读取文件:

theLogFile = The_Root_Path + ".processedlog"
if os.path.isfile(theLogFile):
        the_file = open(theLogFile, "r")
    else:
        open(theLogFile, 'w').close()
        the_file = open(theLogFile, "r")
    the_log = the_file.read()
    the_file.close()

然后在for 循环中我重新分配(直到我发布这个问题我才意识到我正在这样做)the_file 变量作为文件列表中的字符串(通过运行文件夹获得,它是子集并获取所有文件名),然后尝试使用正则表达式查看该文件名是否存在于日志文件中:

for the_file in filenamelist:
    p = re.compile(the_file, re.IGNORECASE)
    m = p.search(the_log)

每次遇到代码的re.compile() 部分时,它都会吐出该错误。如果我尝试删除它,并使用re.search(the_file, the_log),它仍然会吐出那个错误。我不明白我怎么会从中得到不平衡的括号。

【问题讨论】:

    标签: python regex


    【解决方案1】:

    正则表达式模式在哪里?您是否尝试使用一个文件中包含的文件名作为搜索另一个文件的模式?如果是这样,您将需要逐步通过the_file 类似

    for the_pattern in the_file:
        p = re.compile(the_pattern, re.IGNORECASE)
        m = p.search(the_log)
        ...
    

    根据the Python re.compile documentationre.compile() 的第一个参数应该是作为字符串的正则表达式模式。

    但是open()的返回值是一个文件对象,你把它赋值给the_file,然后传给re.compile()....

    【讨论】:

    • 我解释得不好。我编辑了这个问题以更好地解释这个问题。对不起。
    • 随意粘贴您正在使用的实际代码,您仍然省略了最重要的部分 - filenamelist 的内容是什么?模式?并且可能在失败的代码行之前加上print the_pattern,然后发布模式......
    【解决方案2】:

    戈登,

    在我看来,问题在于数据。您正在将 filelist 中未经检查的字符串编译为正则表达式,而没有注意到它们可能包含与正则表达式引擎相关的元字符。

    在你的 for 循环中,在调用 re.compile 之前添加一个print the_file(你可以重用一个名称作为之前引用文件对象的循环迭代器),这样你就可以看到哪个字符串实际上来自文件列表。或者,更好的是,通过re.escape 运行the_file 的所有实例,然后再将它们传递给re.compile。这会将所有元字符转换为正常的等价物。

    【讨论】:

    • 就是这样。谢谢。使用re.escape 修复它。
    【解决方案3】:

    您在第一个 sn-p 中绑定到名称 the_file 的是 文件对象,即使您说这是“保存为字符串”,文件名(即字符串)实际上被命名为theLogFile,但你试图变成一个RE对象的是not theLogFile(字符串),它是the_file(现在关闭的文件对象)。鉴于此,错误有点古怪(人们会期待 TypeError),但很明显,您re.compile 处收到错误。

    【讨论】:

    • 我解释得不好。我编辑了这个问题以更好地解释这个问题。对不起。
    【解决方案4】:

    the_file 应该是一个字符串。上面代码中the_file是open的返回值,是一个文件对象。

    【讨论】:

    • 我解释得不好。我编辑了这个问题以更好地解释这个问题。对不起。
    猜你喜欢
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    相关资源
    最近更新 更多