Python Regex匹配文件列表中的文件(获取错误)

2024-09-30 22:23:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在Python中使用regex来匹配文件(保存为字符串,即“/volumes/feeds/foo”)/移动棒)添加到我创建的包含文件列表的日志文件。但是当我运行脚本时,它会给我一个错误: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变量作为一个字符串从一个文件列表(通过运行文件夹及其子集并获取所有文件名获得)中重新分配{}变量,然后尝试使用regex查看日志文件中是否存在该文件名:

^{pr2}$

每次它碰到代码的re.compile()部分时,它就会抛出这个错误。如果我试着删掉它,并使用re.search(the_file, the_log)它仍然会显示出错误。我不明白我怎么会得到不平衡的括号。在


Tags: 文件the字符串代码relog列表close
3条回答

戈登

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

在for循环中,在调用之前添加一个print the_file重新编译(使用一个名称作为之前引用file对象的循环迭代器是没有问题的),因此可以看到哪些字符串实际上来自filelist。或者,更好的方法是,在将这些实例传递给重新编译. 这将把所有的元字符转换成它们的正常等价物。在

正则表达式模式在哪里?您是否尝试使用一个文件中包含的文件名作为模式来搜索另一个文件?如果是这样的话,您将希望使用类似于

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

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

但是open()的返回值是一个file对象,您将其分配给the_file,并传递给re.compile()。。。。在

在第一个代码段中,绑定到名称the_file的是一个文件对象,尽管你说那是“另存为字符串”,但文件名(即字符串)实际上命名为theLogFile,但您试图将其转换为re对象的是而不是theLogFile(字符串),它是the_file(现在关闭的文件对象)。考虑到这一点,这个错误有点奇怪(人们可能会期待一个TypeError),但是很明显,将在re.compile处得到一个错误。在

相关问题 更多 >