2017-05-08 3 views
-1

Ich versuche, eine Zeichenfolge zu erkennen, irgendwann erscheint es als eine Zeile und manchmal erscheint es als Multilinie.Python Regex zu erkennen Zeichenfolge in Multilinie

Fall 1:

==================== 1 error in 500.14 seconds ============= 

Fall 2:

================= 3 tests deselected by "-m 'not regression'" ================== 
21 failed, 553 passed, 35 skipped, 3 deselected, 4 error, 51 rerun in 6532.96 seconds 

Ich habe die folgende Sache versucht, aber es funktioniert nicht

==+.*(?i)(?m)(error|failed).*(==+|seconds) 
+0

Welchen Inhalt brauchen Sie für die zweite Zeichenfolge? – VMRuiz

+0

Fehlgeschlagene Tests. ** xx failed ** oder ** xx error ** –

+0

Gibt es einen Grund, warum '\ d + failed | \ d + error' nicht ausreichen würde? – VMRuiz

Antwort

1

Benutzen Sie das untere regex:

==+[\s\S]*?(\d+)\s(error|failed).*(==+|seconds) 
  • [\s\S] anstelle von . ermöglicht Zeilentrennzeichen als auch
  • (\d+) ist die erste passende Gruppe so matches[0] wird immer die Anzahl enthält, wie beispielsweise 1 oder 21
  • (error|failed) die zweite Anpassungsgruppe ist so matches[1] enthält entweder ' Fehler‘oder 'nicht bestanden'

Regex101 Demo

Testing in P ython:

import re 

pattern = "==+[\s\S]*?(\d+)\s(error|failed).*(==+|seconds)" 
case1 = "==================== 1 error in 500.14 seconds =============" 
p = re.compile(pattern) 
matches = p.match(case1).groups() 
matches[0] + " " + matches[1] # Output: '1 error' 

case2 = """================= 3 tests deselected by -m 'not regression' ================== 
21 failed, 553 passed, 35 skipped, 3 deselected, 4 error, 51 rerun in 6532.96 seconds""" 
matches = p.match(case2).groups() 
matches[0] + " " + matches[1] # Output: '21 failed' 

Hoffe, das hilft!

Verwandte Themen