2009-07-05 6 views
1

Guten Tag werden könnte fehlen,Extract Teilzeichenfolge zwischen zwei Token. Zweite Token

I Teil der Zeichenkette extrahieren müssen, die kann wie folgt aussieht:

"some_text MarkerA some_text_to_extract MarkerB some_text" 
"some_text MarkerA some_text_to_extract" 

Ich brauche zu extrahieren some_text_to_extract in beiden Fällen. MarkerA, MarkerB - vordefinierte Textstrings.

habe ich versucht, dieses regexps, aber ohne Glück:

".*\sMarkerA(.*)MarkerB.*" - does not work in case 2 
".*\sMarkerA(.*)(?=MarkerB)?.*" - wrong result "some_text_to_extract MarkerB some_text" 
".*\sMarkerA(.*)(?:MarkerB)?.*" - does not work at all 

Könnten Sie mir bitte mit diesem Problem helfen?

Antwort

0

Versuchen:

".*\sMarkerA(.*?)(?=$|MarkerB)" 

Prüfregeln:

#!/usr/bin/env python 

tests = [ 
     ("some_text MarkerA some_text_to_extract MarkerB some_text"," some_text_to_extract "), 
     ("some_text MarkerA some_text_to_extract"," some_text_to_extract") 
     ] 

import re 
reg = re.compile(r".*\sMarkerA(.*?)(?=$|MarkerB)") 

for (input,expected) in tests: 
    mo = reg.match(input) 
    assert mo is not None 
    print mo.group(1),expected 
    assert mo.group(1) == expected 
+0

Danke Douglas! Das war genau was ich brauche =) –

2

Zuerst die .* am Anfang loszuwerden und das Ende; Sie müssen nicht die gesamte Zeichenfolge übereinstimmen. Verwenden Sie dann Alternation, um entweder das Endtrennzeichen oder das Ende der Zeichenfolge zu finden.

"MarkerA(.*?)(?:MarkerB|$)" 
0

Der

".*\sMarkerA(.*)" 

Teil des Regex wird alles passen nach MarkerA keiner Änderung für MarkerB oder irgendetwas anderes passen geben zu lassen. Der. * Ist gierig, du kannst die nicht gierige Form von *, * benutzen? zu geben:

".*\sMarkerA(.*)(?=MarkerB)?.*" 

Sie wahrscheinlich vor MarkerB den Raum nicht aufnehmen wollen, so in diesem Fall Gebrauch:

".*\sMarkerA(.*)(?=\sMarkerB)?.*"