2017-07-03 2 views
2

Ich habe eine Zeichenfolge, die eine Python-Stack-Trace wie diese, die (mit einigen irrelevant Text vorher und nachher):mehrzeilige RegEx: letzte Vorkommen entsprechen nur

Traceback (most recent call last): 
    File "/workspace/r111.py", line 232, in test_assess 
    exec(code) 
    File "a111.py", line 17, in 
    def reset(self): 
    File "/workspace/r111.py", line 123, in failed 
    raise AssertionError(msg) 
AssertionError: Dein Programm funktioniert nicht. Python sagt: 
Traceback (most recent call last): 
    File "a111.py", line 6, in 
    File "/workspace/r111.py", line 111, in runcaptured 
    exec(c, variables) 
    File "", line 1, in 
ZeroDivisionError: division by zero 

Jetzt habe ich die Linie zu extrahieren, in dem der Fehler aufgetreten ist (1 extrahiert aus File "", line 1) mit einer mehrzeiligen RegEx (in Ruby).

/File ".*", line ([0-9]+)/ funktioniert gut, aber entspricht allen Vorkommen. Ich will nur das Letzte. Das Iterieren über die Übereinstimmungen in der Zielumgebung ist keine gültige Lösung, da ich die Geschäftslogik dort nicht ändern kann.

+2

's Versuchen [/ (m:. *) (- m) " *" Datei, Zeile ([0-9] +)/1]'. –

+0

@ WiktorStribiżew schöne, sollten Sie es als Antwort mit einer kurzen Erklärung von '(? M)' und '(? -m)'. – Stefan

+0

Bitte fügen Sie _solved_ nicht an den Titel an oder fügen Sie keine Änderungen hinzu, um Lösungen zu Ihrer Frage hinzuzufügen. Sobald Sie Ihre Antwort akzeptiert haben, werden andere wissen, dass dies gelöst ist. – Bugs

Antwort

3

können Sie verwenden

/(?m:.*)(?-m:File ".*", line ([0-9]+))/ 

Einzelheiten

  • (?m:.*) - eine Modifizierungsgruppe, wo die mehrzeilige Flagge ist und der Punkt entspricht einem beliebigen Zeichen einschließlich Zeilenumbruch Zeichen, die jede Null entspricht oder mehr Zeichen so viele wie möglich bis zum letzten Auftreten der folgenden Untermuster
  • (?-m:File ".*", line ([0-9]+)) - ein weitere Modifizierungsgruppe, wo der mehrzeilige Flag ausgeschaltet ist und der Punkt paßt nun alle Zeichen aber Zeilenumbruch Zeichen:
    • File - eine wörtliche String mit einem Raum, nachdem es
    • ".*" - ein doppeltes Anführungszeichen, jeder Null oder MMORE Zeichen außer Zeilenumbrüche und dann ein weiteres doppeltes Anführungszeichen
    • , line - Komma, Leerzeichen, „Linie“ Teilzeichenfolge
    • ([0-9]+) -Group 1 Erfassung einer oder mehreren Ziffern.
+1

Sie haben das [auf einem Handy] geschrieben (https://stackoverflow.com/questions/44882462/multiline-regex-match-last-occurrence-only#comment76744490_44882462)? Hut ab für Dich :-) – Stefan

Verwandte Themen