2016-03-06 99 views
0

我正在執行與strip()相同的功能。在Python中使用正則表達式自定義strip()

def strip(string, chars = None): 
     if chars == None: 
     regexOne = re.compile(r'(\w+(\s\w+)*)') 
     mo = regexOne.search(string) 
     return mo.group() 
    else: 
     regexTwo = re.compile(r'([' + chars + ']*)(.*?)([' + chars + ']*)$') 
     mo = regexTwo.search(string) 
     return mo.group(2) 

其實它的工作原理,但我不明白爲什麼我必須把$在regexTwo結束,它只能如果它存在,沒有它,第2組是空的。我知道它意味着字符串的結尾,但我不知道爲什麼它在這個正則表達式中非常重要。

+0

您與regexTwo匹配的是什麼模式? – 2016-03-06 17:46:47

+0

它可以是任何東西,結果是一樣的,可以說字符串是ThePython的,字符是 –

回答

0

$在模式結束時告訴匹配必須發生,直到字符串結束。

其實,嘗試用你的函數這個字符串

s1 = " ABC DEF GHI " 
def strip(string, chars = None): 
    if chars == None: 
    regexOne = re.compile(r'(\w+(\s\w+)*)') 
    mo = regexOne.search(string) 
    return mo.group() 
    else: 
    regexTwo = re.compile(r'([' + chars + ']*)(.*?)([' + chars + ']*)$') 
    mo = regexTwo.search(string) 
    return mo.group(2) 

print strip(s1) 
print s1.strip() 

這將打印

ABC 
ABC DEF GHI 

兩個結果是不一樣的。

0

如果沒有$,那麼您的正則表達式可以有效地匹配三個組中的任何一個的0個字符。

第一組使用*這是貪婪的,所以任何可以消耗的字符將會是。

第二組使用*?這是非貪婪的,所以如果可以消耗0個字符,則會消耗0個字符。那是你那裏問題的根源。

使用你的例子:

>>> import re 
>>> re.search(r'([The]*)(.*?)([The]*)', 'ThePythonThe').groups() 
('The', '', '') 

這將消耗在第一組The。那麼在第二組中將不會消耗任何東西,因爲*?是非貪婪的,所以當第三組發現它也可以無效地匹配時,它將嘗試不消耗任何東西併成功。

隨着$,組3在字符串的端到端和因爲它的非貪婪組2儘可能仍然小:

>>> import re 
>>> re.search(r'([The]*)(.*?)([The]*)$', 'ThePythonThe').groups() 
('The', 'Python', 'The') 

如果*?變更爲*,第2組將消耗所有可能由於貪婪和第3組的人物將永遠不會有任何字符:

>>> re.search(r'([The]*)(.*)([The]*)$', 'ThePythonThe').groups() 
('The', 'PythonThe', '') 

爲了確保正確無誤,您將需要$底,但我也願意在開始時建議使用^以便清楚(^使意圖非常清楚)。