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
- ver stackoverflow.com/questions/164414/…
- Hay ' sa discusión similar sobre grep en python en SO: stackoverflow.com/questions/1921894/grep-and-python , esta pregunta es una versión más específica de eso
- \ w = cualquier palabra char \ W = cualquier carácter que no sea una palabra
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 dea
az
" pero usted ' he implementadogrep '[^a-z]'
lo que significa que " incluye cualquier línea que contenga un carácter no en el rango dea
az
. " Si una línea tieneabc123
entonces su consulta la imprimirá erróneamente porque1
satisface ese criterio.grep -v '[a-z]'
no imprimirá esta línea porquea
satisface los criterios denegados.