¿Cuál es el equivalente en python de grep -v?

Me gusta grep -v. Lo uso todo el tiempo. Pero también estoy procesando texto en Python, y hay una cosa crucial que me falta.

Por lo general, uso grep -v para eliminar cosas extrañas de texto.

Por ejemplo,

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

Pero, ¿cómo hago coincidir el complemento de una expresión regular en Python? Por ejemplo, el complemento de \w?

Comentarios

Responder

Una expresión regular en Python, los métodos search o match, devuelven un objeto Match o None. Para grep -v equivalente, puede usar:

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

O de manera más concisa:

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

Comentarios

  • +1 en el enlace SO en el comentario menciona afirmaciones de anticipación negativa, pero para ser honesto, creo que su fragmento es mucho más sensato y elegante. gracias.
  • resulta que también puedes usar [^ az] para hacer coincidir el complemento del conjunto [az]

Responder

Resulta que puedes usar [^ az] para significar grep -v [a-z].

Lo estoy 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  

Comentarios

  • No son iguales. grep -v '[a-z]' significa " excluir cualquier línea que contenga un carácter en el rango de a a z " pero usted ' he implementado grep '[^a-z]' lo que significa que " incluye cualquier línea que contenga un carácter no en el rango de a a z. " Si una línea tiene abc123 entonces su consulta la imprimirá erróneamente porque 1 satisface ese criterio. grep -v '[a-z]' no imprimirá esta línea porque a satisface los criterios denegados.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *