2012-02-21 63 views
0
IDLE 1.1.4  
>>> import re 
>>> some_text = 'alpha, beta,,,,gamma delta' 
>>> re.split('[, ]+', some_text) 
['alpha', 'beta', 'gamma', 'delta'] 
# when the pattern doesn't contain parentheses, the returned values 
# only include matched substrings but separators. 

>>> re.split('([, ]+)', some_text) 
['alpha', ', ', 'beta', ',,,,', 'gamma', ' ', 'delta'] 
# returned values include separators and I can guess how it works. 

>>> re.split('([, ])+', some_text) 
['alpha', ' ', 'beta', ',', 'gamma', ' ', 'delta'] 
# Now I cannot even guess what is going on here. 

問題>是什麼'([, ]+)''([, ])+'之間的差異? 它如何影響返回值?匹配圖案差`([,] +)`和`([,])+`

+1

您可能想嘗試與're.search()'匹配,看看匹配是什麼;分組的行爲在這裏引入了額外的複雜性。 – tripleee 2012-02-21 05:52:20

回答

3

([, ]+),,,,說:「比賽的一個或多個逗號和/或空格和捕獲他們作爲一個羣體「,因此在你的第二個例子中,你可以看到一組分隔符的字符串。

([, ])+表示「匹配一個逗號或空格,並捕獲一個或多個這些組」。因此,在第三個示例中,每個分隔符都被捕獲到它自己的組中,並且每次只獲取其中的最後一個。

1

注意您的匹配組。

  • ([, ]+)此匹配1個或多個的,或空間,並返回所有這些,其中捕獲這些字符的長鏈。
  • ([, ])+它匹配空間或,並將其作爲一個組返回。
+0

當模式爲'([,])+'時,如何解釋第二個返回的項目''?alpha和beta之間的子串包含','爲什麼只返回''? – q0987 2012-02-21 05:05:23

+0

因爲它首先找到','。 – Blender 2012-02-21 05:22:28

+0

如果發現','首先,爲什麼首先返回''''? – q0987 2012-02-21 19:12:01

4

前者將「」和「,」的所有實例放入一個組中,而後者返回一個只包含最後一個的組。

2

如果在你的字符串,當你的模式是([, ]+)這個組將返回,,,,,如果你的模式是([, ])+將返回,

1

更改您的逗號ABCD如下面看到它視覺:

some_text2 = 'alphaA betaABCDgamma增量'

re.split( '([ABCD])+',some_text2)

['alpha','','beta','D','gamma','','delta']

它實際上匹配每個逗號,但是作爲1個字符組。 +將它變成貪婪的匹配,直到它不再匹配字符類中的字母。

嘗試而不+

re.split( '([ABCD])',some_text2)

[ '的α', 'A', '', '', '的β ' 'A', '', 'B', '', 'C', '', 'd', 'γ', '', '', ' ','', '', 'delta']