Ich habe die folgende Eingabe,
OK SYS 10 LEN 20 12 43
1233a.fdads.txt,23 /data/a11134/a.txt
3232b.ddsss.txt,32 /data/d13f11/b.txt
3452d.dsasa.txt,1234 /data/c13af4/f.txt
.
Und ich möchte die gesamte Eingabe extrahieren, außer die Zeile, die "OK SYS 10 LEN 20
" enthält, und die letzte Zeile, die einen einzelnen "."
(Punkt) ..__ enthält. Das heißt, ich möchte folgendes extrahieren
1233a.fdads.txt,23 /data/a11134/a.txt
3232b.ddsss.txt,32 /data/d13f11/b.txt
3452d.dsasa.txt.1234 /data/c13af4/f.txt
Ich habe folgendes versucht:
for item in output:
matchObj = re.search("^(?!OK) | ^(?!\\.)", item)
if matchObj:
print "got item " + item
aber es funktioniert nicht, da es keine Ausgabe erzeugt.
Sehen Sie es in Aktion :
matchObj = re.search("^(?!OK|\\.).*", item)
Vergiss nicht, .*
nach dem negativen Look-Ahead zu setzen, sonst könntest du keine Übereinstimmung finden ;-)
if not (line.startswith("OK ") or line.strip() == "."):
print line
Verwenden Sie eine negative Übereinstimmung. (Beachten Sie auch, dass Whitespace standardmäßig innerhalb eines regulären Ausdrucks von Bedeutung ist. Platzieren Sie also keine Leerzeichen. Alternativ verwenden Sie re.VERBOSE .
for item in output:
matchObj = re.search("^(OK|\\.)", item)
if not matchObj:
print "got item " + item
Warum passen Sie nicht zur Zeile OK SYS und geben Sie sie nicht zurück.
for item in output:
matchObj = re.search("(OK SYS|\\.).*", item)
if not matchObj:
print "got item " + item
Wenn dies eine Datei ist, können Sie einfach die erste und letzte Zeile überspringen und den Rest mit csv
lesen:
>>> s = """OK SYS 10 LEN 20 12 43
... 1233a.fdads.txt,23 /data/a11134/a.txt
... 3232b.ddsss.txt,32 /data/d13f11/b.txt
... 3452d.dsasa.txt,1234 /data/c13af4/f.txt
... ."""
>>> stream = StringIO.StringIO(s)
>>> rows = [row for row in csv.reader(stream,delimiter=',') if len(row) == 2]
>>> rows
[['1233a.fdads.txt', '23 /data/a11134/a.txt'], ['3232b.ddsss.txt', '32 /data/d13f11/b.txt'], ['3452d.dsasa.txt', '1234 /data/c13af4/f.txt']]
Wenn es sich um eine Datei handelt, können Sie Folgendes tun:
with open('myfile.txt','r') as f:
rows = [row for row in csv.reader(f,delimiter=',') if len(row) == 2]
and(re.search("bla_bla_pattern", str_item, re.IGNORECASE) == None)
funktioniert.
Sie können es auch ohne negativen Blick nach vorne machen. Sie müssen lediglich dem Teil des Ausdrucks, den Sie extrahieren möchten, Klammern hinzufügen. Diese Konstruktion mit Klammern heißt group
.
Schreiben wir Python-Code:
string = """OK SYS 10 LEN 20 12 43
1233a.fdads.txt,23 /data/a11134/a.txt
3232b.ddsss.txt,32 /data/d13f11/b.txt
3452d.dsasa.txt,1234 /data/c13af4/f.txt
.
"""
search_result = re.search(r"^OK.*\n((.|\s)*).", string)
if search_result:
print(search_result.group(1))
Ausgabe ist:
1233a.fdads.txt,23 /data/a11134/a.txt
3232b.ddsss.txt,32 /data/d13f11/b.txt
3452d.dsasa.txt,1234 /data/c13af4/f.txt
^OK.*\n
findet die erste Zeile mit der OK-Anweisung, aber wir möchten sie nicht extrahieren, also lassen Sie sie ohne Klammern. Der nächste Teil ist der, den wir erfassen möchten: ((.|\s)*)
, also in Klammern. Und am Ende von regexp suchen wir nach einem Punkt .
, aber wir möchten ihn auch nicht erfassen.
P .: Ich finde diese Antwort sehr hilfreich, um die Macht von Gruppen zu verstehen. https://stackoverflow.com/a/3513858/4333811