Python Regex para corresponder a um arquivo em uma lista de arquivos (obtendo erro)
Pergunta
Estou tentando usar um regex no python para corresponder a um arquivo (salvo como uma string, ou seja, "/volumes/fotage/foo/bar.mov") em um arquivo de log que eu crio que contém uma lista de arquivos. Mas quando eu corro o script, ele me dá esse erro: sre_constants.error: unbalanced parenthesis
. O código que estou usando é o seguinte:
Para ler o arquivo:
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()
Então dentro de um for
loop eu reatrio (eu não sabia que estava fazendo isso até postar esta pergunta) o the_file
Variável como uma string de uma lista de arquivos (obtida pela execução de uma pasta e seus subconjuntos e pegando todos os nomes de arquivos); em seguida, tente usar o Regex para ver se esse nome de arquivo está presente no arquivo de log:
for the_file in filenamelist:
p = re.compile(the_file, re.IGNORECASE)
m = p.search(the_log)
Toda vez que atinge o re.compile()
Parte do código que cospe esse erro. E se eu tentar cortar isso e usar re.search(the_file, the_log)
Ainda cospe esse erro. Não entendo como poderia estar recebendo parênteses desequilibrados disso.
Solução
Gordon,
Parece -me que o problema está nos dados. Você está compilando cordas não inspecionadas do filelist
no regexp, não atendendo a que eles possam conter meta -caracteres relevantes para o mecanismo Regexp.
No seu loop, adicione um print the_file
Antes da chamada para re.compile (não é um problema que você esteja reutilizando um nome como o iterador de loop que se referiu ao objeto de arquivo antes), para que você possa ver quais strings são realmente provenientes da lista de fileiras. Ou, melhor ainda, execute todas as instâncias do arquivo através re.escape
Antes de passá -los para re.compile. Isso transformará todos os personagens meta em seu equivalente normal.
Outras dicas
Onde está o padrão de expressão regular? Você está tentando usar nomes de arquivos contidos em um arquivo como padrões para pesquisar o outro arquivo? Nesse caso, você vai querer passar the_file
com algo como
for the_pattern in the_file:
p = re.compile(the_pattern, re.IGNORECASE)
m = p.search(the_log)
...
De acordo com o python re.compile
documentação, o primeiro argumento para re.compile()
deve ser o padrão de expressão regular como uma corda.
Mas o valor de retorno de open()
é um objeto de arquivo que você atribui a the_file
e passar para re.compile()
....
O que você está vinculativo ao nome the_file
em seu primeiro snippet é um objeto de arquivo, mesmo que você diga que é "salvo como uma string", o nome do arquivo (ou seja, a string) é realmente nomeado theLogFile
Mas o que você está tentando se transformar em um objeto é não theLogFile
(a string), é the_file
(o objeto de arquivo agora fechado). Dado isso, o erro é um tanto peculiar (seria de esperar um TypeError
), mas está claro que você vai Obtenha um erro em re.compile
.
o arquivo deve ser uma string. No código acima, o arquivo é o valor de retorno do Open, que é um objeto de arquivo.