Was ist das Python-Äquivalent von grep -v?

Ich mag grep -v. Ich benutze es die ganze Zeit. Aber ich mache auch eine Textverarbeitung in Python, und es gibt eine entscheidende Sache, die mir fehlt.

Normalerweise verwende ich grep -v, um überflüssiges Material zu entfernen Text.

Zum Beispiel

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

Aber wie kann ich das Komplement einer Regex in Python abgleichen? Zum Beispiel das Komplement von \w?

Kommentare

Antwort

Ein regulärer Ausdruck In Python gibt entweder die Methode search oder match ein Match -Objekt oder None. Für grep -v Äquivalent können Sie Folgendes verwenden:

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

Oder genauer:

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

Kommentare

  • +1 Der SO-Link im Kommentar erwähnt negative Aussagen, aber um ehrlich zu sein, denke ich, dass Ihr Snippet viel vernünftiger und eleganter ist. danke.
  • es stellt sich heraus, dass Sie auch [^ az] verwenden können, um das Komplement der Menge [az]

Antwort

abzugleichen

Es stellt sich heraus, dass Sie einfach [^ az] verwenden können, um grep -v [a-z] zu bedeuten.

Ich verwende es wie :

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

Kommentare

  • Diese sind nicht identisch. grep -v '[a-z]' bedeutet, dass " alle Zeilen ausschließt, die ein Zeichen im Bereich enthalten von a bis z " aber Sie ' habe grep '[^a-z]' implementiert, was bedeutet, dass " jede Zeile enthält, die ein Zeichen nicht im Bereich von a bis z. " Wenn eine Zeile abc123 dann wird Ihre Abfrage sie fälschlicherweise drucken, weil 1 erfüllt diese Kriterien. grep -v '[a-z]' druckt diese Zeile nicht, da a die negierten Kriterien erfüllt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.