2016-05-02 146 views
0

簡單正則表達式函數,它匹配字符串「Bananas:」的開頭並返回第二部分。我已經不把正則表達式,但它不是我期望它的工作方式:正則表達式匹配,返回字符串剩餘部分

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! 

但是,我相信,你不必爲了得到相同的結果與(.*)識別組。即匹配字符串的第一部分 - 返回其餘部分。但我不知道該怎麼做。

另外我讀了一個地方,你應該謹慎使用.*在正則表達式。

回答

3

你可以使用一個lookbehind(?<=)):

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

記住使用re.search代替re.match,因爲後者將嘗試匹配的字符串(又名隱^)的開始。


至於.*擔憂 - 它可以引起很多回溯,如果你不具備的正則表達式是如何工作的一個清醒的認識,但在這種情況下,它是保證線性搜索。

1

使用替代正則表達式模塊「regex」你可以使用Perl的\K元字符,這使得它能夠丟棄先前匹配的內容,只有ķ EEP以下。

我沒有真正推薦這個,我認爲你的解決方案已經足夠好了,並且lookbehind的答案也可能比使用另一個模塊更好。