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
- consulte stackoverflow.com/questions/164414/…
- Lá ' sa discussão semelhante sobre grep em python em SO: stackoverflow.com/questions/1921894/grep-and-python , esta questão é uma versão mais específica disso
- \ w = qualquer palavra char \ W = qualquer não-palavra char
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 dea
az
", mas você ' ve implementadogrep '[^a-z]'
que significa " incluir qualquer linha que contenha um caractere não no intervalo dea
paraz
. " Se uma linha tiverabc123
então sua consulta irá imprimi-lo erroneamente porque1
satisfaz esses critérios.grep -v '[a-z]'
não imprimirá esta linha porquea
satisfaz os critérios negados.