wake-up-neo.com

'negativer' Mustervergleich in Python

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. 

15
JosiP

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 ;-)

35
mmdemirbas
 if not (line.startswith("OK ") or line.strip() == "."):
     print line
4
Jochen Ritzel

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
4
Marcelo Cantos

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
2
Pablo Jomer

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]
1
Burhan Khalid
and(re.search("bla_bla_pattern", str_item, re.IGNORECASE) == None)

funktioniert.

0
hkn06tr

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

0
Alex Misulya