Python的正则表达式中的文件列表的文件相匹配(得到错误)

StackOverflow https://stackoverflow.com/questions/2344193

  •  23-09-2019
  •  | 
  •  

我想使用正则表达式在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)它仍然吐出了这个错误。我不明白我怎么可以从这个越来越不平衡的括号。

有帮助吗?

解决方案

戈登,

这似乎对我来说,问题是在数据中。你是从filelist成正则表达式编译未经检验字符串,没有注意到他们可能包含元字符有关的正则表达式引擎。

在调用re.compile之前,你的循环,增加print the_file(这是没有问题的,你是重新使用的名称与之前提到的文件对象的循环迭代),所以你可以看到哪些字符串从文件列表中的实际到来。或者更好的是,它们传递给re.compile之前通过re.escape运行the_file的所有实例。这将打开所有的元字符到其正常的等价物。

其他提示

其中是正则表达式模式?你们是不是要使用包含在一个文件的文件名作为模式来搜索其他文件?如果是这样,您将通过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() ....

您已经在第一个片段结合名the_file什么是文件对象,即使你说的“保存为一个字符串”,文件名(即字符串)实际上是一个名为theLogFile但你想t关闭到RE对象是什么的不可以 theLogFile(串),它的the_file(现已关闭的文件对象)。鉴于此,错误是有点奇特,(人们所期望的一个TypeError),但很明显,你的是在re.compile得到一个错误。

<强> the_file 应的字符串。在上面的代码the_file是开放的返回值,它是一个文件对象。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top