2014-05-25 35 views
2

學習正則表達式正變得越來越困難,請參閱下面的python正則表達式代碼片段。爲什麼這個正則表達式模式甚至匹配字符串中的一個額外字符?

>>> import re 
>>> str = "demo" 
>>> re.search("d?mo",str) 
<_sre.SRE_Match object at 0x00B65330> 

在上面的例子中,爲什麼它返回匹配的對象,即使它不是?

我知道,符號'?'意味着它將匹配前面的字符的0或1的重複,但

從上面的例子,

1.'d' is matched with 'd' 
2.'m' is matched with 'm' 
3.'o' is matched with 'o' 

但隨着該字符「E」被匹配?根據我的理解,只有'dmo'或'mo'必須與給定的模式匹配,但爲什麼'演示'。

如果我只想匹配'dmo'或'mo',那麼正確的模式是什麼?

+0

不要命名變量'str',因爲你會掩蓋內置的[str函數](https://docs.python.org/2/library/functions.html#str) – dawg

回答

1

那是因爲你在做re.search而不是re.match。如果你想整個字符串匹配,你要做的:

re.match("d?mo$",str) 

或者,你也可以這樣做:

re.search("^d?mo$",str) 

來達到類似的效果

+0

你能否讓我們我知道匹配和搜索方法之間的區別嗎? –

+1

@RajeshKumar,'match'只從字符串的開頭搜索。 – sshashank124

+0

哪個字符與'e'匹配? –

2

re.search('R', str)實際上是相同的re.match('.*R', str)正則表達式R

所以,你必須(有效...忽略換行符)

re.match(".*d?mo", "demo") 

其中.*比賽"de",則d?比賽""mo比賽"mo"


您可以用捕獲組檢查:

re.search("(d?mo)", "demo").group(0) 
#>>> 'mo' 

d?匹配任何東西,因爲它是可選的。

相關問題