Líbí se mi grep -v
. Používám to pořád. Ale také dělám nějaké zpracování textu v pythonu a je tu jedna zásadní věc, která mi chybí.
Obvykle používám grep -v
k odstranění cizích věcí text.
Například
$ grep -v "[a-z]" # (I manually review this output to confirm that I don"t want those lines) $ grep "[a-z]" > linesiwanted
Jak ale porovnám doplněk regexu v Pythonu? Například doplněk \w
?
Komentáře
- viz stackoverflow.com/questions/164414/…
- tam ' sa podobná diskuse o grepu v pythonu na SO: stackoverflow.com/questions/1921894/grep-and-python , tato otázka jeho konkrétnější verze
- \ w = libovolné slovo char \ W = libovolné jiné než slovo char
odpověď
regex v Pythonu vrátí metoda search
nebo match
objekt Match
nebo None
. Pro ekvivalent grep -v
můžete použít:
import re for line in sys.stdin: if re.search(r"[a-z]", line) is None: sys.stdout.write(line)
Nebo ještě stručněji:
import re; sys.stdout.writelines([line for line in sys.stdin if re.search(r"[a-z]", line) is None])
Komentáře
- +1 odkaz SO v komentáři zmiňuje tvrzení negativního vzhledu, ale abych byl upřímný, myslím, že váš úryvek je mnohem rozumnější a elegantnější. děkuji.
- ukázalo se, že můžete také použít [^ az] k doplnění množiny sady [az]
odpověď
Ukázalo se, že stačí použít [^ az] ve smyslu grep -v [a-z]
.
Používám to jako :
#!/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
Komentáře
- Nejsou to stejné.
grep -v '[a-z]'
znamená " vyloučit jakýkoli řádek obsahující znak v rozsahu oda
doz
" ale vy ' jsem implementovángrep '[^a-z]'
což znamená " zahrnout jakýkoli řádek obsahující znak ne v rozsahu oda
ažz
. " Pokud má řádekabc123
poté jej váš dotaz omylem vytiskne, protože1
tato kritéria splňuje.grep -v '[a-z]'
tento řádek nevytiskne, protožea
splňuje negovaná kritéria.