Qual é o equivalente em python de grep -v?

Gosto de grep -v. Eu uso isso o tempo todo. Mas também estou fazendo algum processamento de texto em python, e há uma coisa crucial que me falta.

Normalmente, eu uso grep -v para remover coisas estranhas de texto.

Por exemplo,

$ grep -v "[a-z]" # (I manually review this output to confirm that I don"t want those lines) $ grep "[a-z]" > linesiwanted 

Mas como faço para combinar o complemento de uma regex em Python? Por exemplo, o complemento de \w?

Comentários

Resposta

Um regex em Python, os métodos search ou match retornam um objeto Match ou None. Para grep -v equivalente, você pode usar:

 import re for line in sys.stdin: if re.search(r"[a-z]", line) is None: sys.stdout.write(line)  

Ou mais concisamente:

 import re; sys.stdout.writelines([line for line in sys.stdin if re.search(r"[a-z]", line) is None])  

Comentários

  • +1 no link do SO no comentário menciona afirmações de antecipação negativa, mas para ser honesto, acho que seu snippet é muito mais sensível e elegante. obrigado.
  • Acontece que você também pode usar [^ az] para combinar o complemento do conjunto [az]

Resposta

Acontece que você pode simplesmente usar [^ az] para significar grep -v [a-z].

Estou usando como :

 #!/usr/bin/env python # coding=UTF-8 import sys, re for file in sys.argv[1:]: f = open(file) string = f.read() regex = re.compile("[^a-z]") subs = regex.sub("", string) f.close() print subs  

Comentários

  • Eles não são iguais. grep -v '[a-z]' significa " excluir qualquer linha que contenha um caractere no intervalo de a a z ", mas você ' ve implementado grep '[^a-z]' que significa " incluir qualquer linha que contenha um caractere não no intervalo de a para z. " Se uma linha tiver abc123 então sua consulta irá imprimi-lo erroneamente porque 1 satisfaz esses critérios. grep -v '[a-z]' não imprimirá esta linha porque a satisfaz os critérios negados.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *