2014-06-24 47 views
4

我正在學習Python的正則表達式,以下是工作,我預計:*在Python正則表達式匹配中有副作用嗎?

>>> import re 
>>> re.split('\s+|:', 'find a str:s2') 
['find', 'a', 'str', 's2'] 

但是,當我改變+*,輸出是怪我:

>>> re.split('\s*|:', 'find a str:s2') 
['find', 'a', 'str:s2'] 

如何爲這樣的模式在Python中解釋?

+1

另見(HTTP://計算器。 com/q/22937618) –

回答

8

您看到的'副作用'是re.split()只會在大於0個字符的匹配項上進行拆分。

\s*|:的圖案上的零個或多個空格,:以先到者爲準匹配。但零空間無處不在。在超過零空格的地方匹配,分割。

由於\s*模式匹配每次考慮分割字符時,下一個選項:從不考慮。

拆分非空的匹配是called out explicitly in the re.split() documentation

注意分裂永遠不會在一個空的模式匹配拆分的字符串。

如果顛倒模式,:考慮,因爲它是第一個選擇:[?參考 - 這是什麼意思的正則表達式]

>>> re.split(':|\s*', 'find a str:s2') 
['find', 'a', 'str', 's2'] 
+0

因此,對於字符串中的第一個字符'f',我可以說它匹配模式,但不會被拆分,因爲它是通過「空模式匹配」? – Deqing

+0

@Deqing:對於'f','\ s *'部分匹配。這是一個0寬度的匹配,所以不會發生分割。接下來,'i'被測試,並且它也匹配'\ s *'等。 –

+0

謝謝你的理解 – Deqing

-4

如果你的意思做「或」爲您匹配,那麼你必須做這樣的事情: re.split('(\s*|:)', 'find a str:s2') 簡而言之: 「+」表示「至少一個字符」。 「*」任何(或沒有)

+1

-1這不回答這個問題。 –