web-dev-qa-db-fra.com

Quel est le python équivalent de grep -v?

J'apprécie grep -v. Je l'utilise tout le temps. Mais je fais aussi du traitement de texte en Python et il y a une chose cruciale que je manque.

Habituellement, j'utilise grep -v prendre des trucs superflus de texte.

Par exemple,

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

$ grep '[a-z]' > linesiwanted

Mais comment faire correspondre le complément d'une regex dans Python? Par exemple, le complément de \w?

14
ixtmixilix

Une regex en python, soit les méthodes search ou match, renvoie un objet Match objet ou None. Pour grep -v équivalent, vous pouvez utiliser:

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

Ou plus concis:

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

Il s'avère que vous pouvez simplement utiliser [^ A-Z] pour signifier grep -v [a-z].

J'utilise ça comme:

#!/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
1
ixtmixilix