2016-05-02 14 views
0

Einfache Regex-Funktion, die dem Anfang einer Zeichenfolge "Bananas:" entspricht und den zweiten Teil zurückgibt. Ich habe nicht die Regex tun, aber es ist nicht so, wie ich es erwartet:Regex-Übereinstimmung, gibt den verbleibenden Rest der Zeichenfolge zurück

import re 

def return_name(s): 
    m = re.match(r"^Bananas:\s?(.*)", s) 

    if m: 
    # print m.group(0) 
    # print m.group(1) 
    return m.group(1) 

somestring = "Bananas: Gwen Stefani" # Bananas: + name 

print return_name(somestring) # Gwen Stefani - correct! 

Aber ich bin überzeugt, dass Sie nicht über die Gruppe identifizieren sich mit (.*), um die gleichen Ergebnisse zu erhalten . dh ersten Teil der Zeichenkette abgleichen - den restlichen Teil zurückgeben. Aber ich bin mir nicht sicher, wie ich das machen soll.

Auch ich las irgendwo, dass Sie vorsichtig sein sollten mit .* in einem Regex.

Antwort

3

könnten Sie einen lookbehind ((?<=)) verwenden:

(?<=^Bananas:\s).* 

Denken Sie daran, re.search statt re.match wie diese zu verwenden, wird versuchen, zu Beginn der Zeichenfolge (auch bekannt als implizite ^) übereinstimmen.


Was die .* betrifft - es vielen Rückzieher verursachen kann, wenn Sie nicht über ein klares Verständnis davon, wie reguläre Ausdrücke funktionieren, aber in diesem Fall ist gewährleistet eine lineare Suche sein.

1

Mit dem alternativen regulären Ausdruck Modul „regex“ Sie \K Perl Meta-Zeichen verwenden könnte, das sie befähigt, die zuvor angepassten Inhalt zu verwerfen und nur K EEP Folgenden.

Ich empfehle das nicht wirklich, ich denke, Ihre Lösung ist gut genug, und die Lookbehind-Antwort ist wahrscheinlich auch besser, als nur ein anderes Modul dafür zu verwenden.

Verwandte Themen