Python Regex para corresponder a um arquivo em uma lista de arquivos (obtendo erro)

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

  •  23-09-2019
  •  | 
  •  

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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top