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

14

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, grep -vsuelo sacar cosas extrañas del 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 combino el complemento de una expresión regular en Python? Por ejemplo, el complemento de \w?

ixtmixilix
fuente
Hay una 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
icc97
\ w = cualquier palabra char \ W = cualquier palabra no char
Kasapo

Respuestas:

17

Una expresión regular en Python, ya sea el método searcho match, devuelve un Matchobjeto o None. Para el grep -vequivalente, puede usar:

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

O más concisamente:

import re; sys.stdout.writelines([line for line in sys.stdin if re.search(r'[a-z]', line) is None])
Arcege
fuente
+1 el enlace SO en el comentario menciona afirmaciones negativas, pero para ser sincero, creo que su fragmento es mucho más sensible y elegante. Gracias.
ixtmixilix
Resulta que también puedes usar [^ az] para que coincida con el complemento del conjunto [az]
ixtmixilix
1

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
ixtmixilix
fuente
Estos no son lo mismo. grep -v '[a-z]'significa "excluir cualquier línea que contenga un carácter en el rango de aa z" pero ha implementado lo grep '[^a-z]'que significa "incluir cualquier línea que contenga un carácter que no esté en el rango de aa z". Si tiene una línea abc123, su consulta la imprimirá erróneamente porque 1satisface ese criterio. grep -v '[a-z]'no imprimirá esta línea porque asatisface los criterios negados.
Adam Katz