2012-02-21 42 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']