Python 正则表达式匹配文件列表中的文件(出现错误)
我正在尝试在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)
,它还是会报同样的错误。我不明白为什么会出现不平衡的括号。
4 个回答
在你第一个代码片段中,你绑定到的名字 the_file
是一个文件对象。虽然你说它是“保存为字符串”,但实际上文件名(也就是那个字符串)是 theLogFile
。你想要转换成正则表达式对象的并不是 theLogFile
(那个字符串),而是 the_file
(现在已经关闭的文件对象)。所以,考虑到这一点,出现的错误有点奇怪(一般情况下应该会出现 TypeError
),但很明显你在 re.compile
这一步肯定会出错。
正则表达式的模式在哪里呢?你是不是想用一个文件里的文件名作为模式去搜索另一个文件?如果是这样的话,你需要用一些方法来逐行处理 the_file
。
for the_pattern in the_file:
p = re.compile(the_pattern, re.IGNORECASE)
m = p.search(the_log)
...
根据Python的 re.compile
文档,传给 re.compile()
的第一个参数应该是一个字符串形式的正则表达式模式。
但是,open()
返回的是一个文件对象,你把它赋值给 the_file
,然后再传给 re.compile()
……
戈登,
我觉得问题出在数据上。你把从 filelist
中获取的字符串直接放进正则表达式里,但没有注意到这些字符串可能包含对正则表达式引擎有影响的特殊字符。
在你的循环里,建议在调用 re.compile 之前加一句 print the_file
,这样你就能看到实际从 filelist 中取出的字符串。更好的办法是,在把这些字符串传给 re.compile 之前,先用 re.escape
处理一遍,这样所有的特殊字符都会变成普通字符。