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
?
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])
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