2017-12-06 1 views
1

Kann Regex-Treffer und erweiterte Übereinstimmungen zurückgeben. Was ich meine, ist ein Regex-Ausdruck, der abhängig von der Struktur eine unterschiedliche Anzahl gefundener Elemente zurückgeben kann. Mein Text ist:Regex-Return-Match und erweiterte Übereinstimmungen

AB : CDE/123.456.1; 1 
AC : DEF/3.1.2 

Meine Rückkehr (Spiel) sein sollte:

'AB', 'CDE', '123.456.1', '1' 
'AC', 'DEF','3.1.2' 

Also, wenn es einen Wert nach einem Semikolon ist dann die regex sollte das auch passen und zurück. Aber wenn nicht, sollte es immer noch mit dem Teil übereinstimmen und den Rest zurückgeben.

Mein Code ist:

import re 

s = '''AB : CDE/123.456.1; 1 
AC : DEF/3.1.2''' 

match1 = re.search(r'((?:AB|AC))\s*:\s*(\w+)\s*\/\s*([\w.]+)\s*(;\s*\d+)', s) 
print(match1[0]) 

match2 = re.search(r'((?:AB|AC))\s*:\s*(\w+)\s*\/\s*([\w.]+)\s*', s) 
print(match2[0]) 

Wo Match1 nur das erste Auftreten entspricht und Match2 nur die zweiten. Was wäre die Regex in beiden Fällen zu arbeiten?

+2

Fügen Sie ein '?' am Ende des ersten Musters hinzu. –

+0

Danke! Das funktioniert! Wenn Sie eine Antwort schreiben, werde ich sie akzeptieren. – mrCarnivore

Antwort

3

Das Muster r'((?:AB|AC))\s*:\s*(\w+)\s*\/\s*([\w.]+)\s*(;\s*\d+)' enthält am Ende ein obligatorisches (;\s*\d+) Muster. Sie müssen es optional machen, und Sie können es tun, indem Sie einen ? Quantifizierer nach ihm hinzufügen, um 1 oder 0 Vorkommen des Untermusters zu entsprechen.

Mit anderen kleineren Verbesserungen, können Sie

r'A[BC]\s*:\s*\w+\s*/\s*[\w.]+\s*(?:;\s*\d+)?' 

Hinweis alle einfangenden Gruppen werden entfernt und nicht-Erfassung diejenigen eingeführt werden, verwenden, da Sie nur den ganzen Match-Wert am Ende bekommen.

Einzelheiten

  • A[BC] - AB oder AC
    • \s*:\s* - ein Doppelpunkt eingeschlossen mit 0+ Leerzeichen Zeichen
  • \w+ - oder mehr Wort Zeichen
  • \s*/\s* - a / mit 0+ Leerzeichen Zeichen eingeschlossen
  • [\w.]+-1 oder mehr Wort oder Zeichen .
  • \s* - 0+ Leerzeichen
  • (?:;\s*\d+)? - eine optionale Sequenz von
    • ; - a ;
    • \s* - 0+ Leerräume
    • \d+ - 1 + Ziffern
Verwandte Themen