Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python正则表达式匹配文件列表中的文件(获取错误)_Python_Regex - Fatal编程技术网

Python正则表达式匹配文件列表中的文件(获取错误)

Python正则表达式匹配文件列表中的文件(获取错误),python,regex,Python,Regex,我正在尝试使用Python中的正则表达式将文件(保存为字符串,即“/volumes/taines/foo/bar.mov”)与我创建的包含文件列表的日志文件相匹配。但是当我运行脚本时,它给了我以下错误:sre\u常量。错误:不平衡的括号。我使用的代码是: 要读取文件,请执行以下操作: theLogFile = The_Root_Path + ".processedlog" if os.path.isfile(theLogFile): the_file = open(theLogF

我正在尝试使用Python中的正则表达式将文件(保存为字符串,即“/volumes/taines/foo/bar.mov”)与我创建的包含文件列表的日志文件相匹配。但是当我运行脚本时,它给了我以下错误:
sre\u常量。错误:不平衡的括号
。我使用的代码是:

要读取文件,请执行以下操作:

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
循环中,我重新分配了
文件变量作为文件列表中的字符串(通过运行文件夹及其子集并获取所有文件名获得),然后尝试使用regex查看日志文件中是否存在该文件名:

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

每次点击代码的
re.compile()
部分时,它都会抛出该错误。如果我试图删掉它,并使用
re.search(文件,日志)
它仍然会抛出错误。我不明白我怎么会从中得到不平衡的括号。

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

for the_pattern in the_file:
    p = re.compile(the_pattern, re.IGNORECASE)
    m = p.search(the_log)
    ...
根据,
re.compile()
的第一个参数应该是字符串形式的正则表达式模式


但是
open()
的返回值是一个文件对象,您将其分配给\u文件
并传递给
re.compile()

您绑定到名称的内容
在您的第一个代码段中,_文件
是一个文件对象,即使您说它“保存为字符串”,文件名(即字符串)实际上被命名为
日志文件
,但您试图转换为re对象的是而不是
日志文件
(字符串),它是_文件(现在关闭的文件对象)。考虑到这一点,这个错误有点奇怪(人们会认为是
TypeError
),但很明显,将在
re.compile
中得到一个错误。\u文件应该是一个字符串。在上面的代码中,_file是open的返回值,它是一个file对象。

Gordon

在我看来,问题在于数据。您正在将未检查的字符串从
文件列表编译到regexp中,没有注意到它们可能包含与regexp引擎相关的元字符


在for循环中,在调用re.compile之前添加一个
打印_文件
(使用名称作为之前引用文件对象的循环迭代器是没有问题的),这样您就可以看到哪些字符串实际上来自文件列表。或者,更好的做法是,在将_文件的所有实例传递给re.compile之前,通过
re.escape
运行这些实例。这将把所有的元字符转换成它们的正常等价物。

我解释得很糟糕。我编辑了这个问题,以便更好地解释这个问题。抱歉。请随意粘贴您正在使用的实际代码,您仍然忽略了最重要的部分—
filenamelist
中用作模式的内容是什么?也许在失败的代码行前面加上
打印出_模式
,然后发布模式……我解释得很糟糕。我编辑了这个问题,以便更好地解释这个问题。对不起,我解释得不好。我编辑了这个问题,以便更好地解释这个问题。对不起,就是这样。谢谢使用
re.escape
修复了它。