2016-11-21 3 views
2

Können sagen wir dieses:Gewusst wie: Überlappende Spiel

A2 A1 B.   #1 

A1 B.   #2 

A3 A1 A8 B.  #3 

Wie würde ich über gehen, wenn ich will:

  1. Passend: A2 A1 B. und A1 B.
  2. Passend: A1 B.
  3. Passend dazu: A3 A1 A8 B. und A1 A8 B. und A8 B.

Bisher habe ich diese Regex bekam:

A\d\s(.*\.) 

Aber es wird nicht Teilmengen von Code übereinstimmen, die bereits angepasst worden ist (ich bin mit re.finditer passend)/Meine Vermutung ist, dass re.finditer tut genau so, wie es sein sollte, und ich versuche nur, es zu dummen Sachen zu machen.

Playground

+1

Eine Frage - warum wollen Sie '' B.' A \ d \ s entsprechen '(* \..)? –

+0

Erwarten Sie, dass 1,2 und 3 Gruppen erfassen? –

+0

@ TadhgMcDonald-Jensen ops, Tippfehler. Fixing it now – Olian04

Antwort

2

Sie können Look-Ahead für diese und Capture-Werte innerhalb des Look-Ahead verwenden:

regex = r"(?=((?:A\d+\s+)+B\.))" 

RegEx Demo

RegEx Beschreibung:

(?=    # start lookahead 
    (    # start capturing group #1 
     (?:   # start non-capturing group 
     A\d+\s+ # match A followed by 1 or more digit followed by 1 or more whitespace 
    )   # end non-capturing group 
     +B\.  # match B and literal DOT 
    )    # end capture group #1 
)     # end lookahead 

Code:

>>> regex = r"(?=((?:A\d+\s+)+B\.))" 

>>> print re.findall(regex, 'A2 A1 B.') 
['A2 A1 B.', 'A1 B.'] 

>>> print re.findall(regex, 'A1 B.') 
['A1 B.'] 

>>> print re.findall(regex, 'A3 A1 A8 B.') 
['A3 A1 A8 B.', 'A1 A8 B.', 'A8 B.']