2016-08-10 7 views
0

Ich habe dieses benutzerdefinierte Protokoll Ereignis, das Severity: HIGH zweimal in jedem Ereignis wiederholt hat. Ich habe versucht, Regex zu verwenden, um nur das erste Auftreten zu vergleichen und es zu entfernen/zu ersetzen. Vor dem Entfernen/Ersetzen der ersten Übereinstimmung habe ich versucht, die erste Übereinstimmung zu wählen, aber meine Regex stimmt mit den beiden Vorkommen überein.Wie nur das erste Auftreten mit Regex übereinstimmen

Host: Hostname 
VServer: NO 
Version: Oracle v11 
Cause: SQL exception 
Severity: HIGH 
JDKPath: C:\Program Files\Java\jdk1.7.0\bin 
Process: 2816 
Severity: HIGH 

Das ist mein Regex, die Spiele sowohl die Vorkommen (Severity:)(.*) oder (Severity:\s.*). Wie wird nur das erste Auftreten (d. H. Die fünfte Zeile) und nicht das zweite Auftreten (d. H. Die letzte Zeile) abgeglichen?

+0

Sie müssen Ihre Frage eingrenzen und nicht mit jeder möglichen Sprache markieren. -1 –

+0

Ihr '(Schweregrad:) (. *)' Muster funktioniert bereits, Sie haben eine Antwort mit einer identischen Lösung akzeptiert. Die Verwendung von Modifikatoren hängt vollständig vom Regex-Geschmack ab, keiner ist angegeben. –

Antwort

1

Aus Ihrer Frage, es nicht klar ist, welchem ​​Kontext Sie verwenden Regex (getaggten PHP und Python), aber in PHP , es ist ganz einfach:

/(Severity:.*)/ 

demo

Dies funktioniert, da standardmäßig die .* Token stimmt nicht mit einem neuen Zeilenzeichen überein. Da Ihre Severity Einträge auf mehreren Zeilen sind, stimmt nur die erste Zeile überein.

+0

Danke für die Antwort, ich benutze http://regexr.com/, die beiden Vorkommen entspricht. – Prime

+1

@Prime Sie sehen beide Übereinstimmungen nur, wenn Sie die globale Flagge verlassen, wie '/.../ g', die ich in meiner Antwort nicht habe. Auf RegExr müssen Sie dieses Flag (Option Flags oben rechts) entfernen, um meine Lösung zu testen. – BeetleJuice

+0

@thanks Entfernen der globalen Flagge/g hat funktioniert – Prime

1

In Python re.search:

Scan durch String für die erste Stelle, wo der reguläre Ausdruck Muster ein Spiel erzeugt, und gibt eine entsprechende MatchObject Instanz. Geben Sie None zurück, wenn keine Position in der Zeichenfolge mit dem Muster übereinstimmt. Beachten Sie, dass sich dies von der Suche nach einer Übereinstimmung der Länge Null an einem bestimmten Punkt in der Zeichenfolge unterscheidet.

>>> import re 
>>> 
>>> log = """Host: Hostname 
... VServer: NO 
... Version: Oracle v11 
... Cause: SQL exception 
... Severity: HIGH 
... JDKPath: C:\Program Files\Java\jdk1.7.0\bin 
... Process: 2816 
... Severity: HIGH""" 
>>> 
>>> m = re.search('Severity\: (.*)', log) 
>>> m.groups() 
('HIGH',) 

Wie Sie sehen können, wird nur der erste abgestimmt.

Wenn Sie umgekehrt re.findall oder re.finditer verwenden, Sie beide dann erhalten:

>>> b = re.findall('Severity\: (.*)', log) 
>>> b 
['HIGH', 'HIGH'] 
>>> 
>>> for f in re.finditer('Severity\: (.*)', log): 
... print f.groups() 
... 
('HIGH',) 
('HIGH',) 
>>> 
+0

danke für deine Mühe – Prime

Verwandte Themen