匹配`([,] +)`和`([,])+`之间的模式差异

时间:2012-02-21 04:43:18

标签: python regex

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.

问题> '([, ]+)''([, ])+'之间有什么区别? 它如何影响返回值?

5 个答案:

答案 0 :(得分:4)

前者将“”和“,”的所有实例放入一个组中,而后者返回一个仅包含最后一个的组。

答案 1 :(得分:3)

([, ]+)说“匹配一个或多个逗号和/或空格并将它们作为一个组捕获”,因此在第二个示例中,您将看到在一个组中返回的整个分隔符字符串。

([, ])+说“匹配一个逗号或空格,并捕获一组或多组这些”。所以在你的第三个例子中,每个分隔符都被捕获在它自己的组中,而你每次只得到最后一个。

答案 2 :(得分:2)

如果您的字符串中有,,,,,那么当您的模式为([, ]+)时,此论坛将返回,,,,,如果您的模式为([, ])+,则会返回, }

答案 3 :(得分:1)

观看您的匹配群组。

  • ([, ]+)这会匹配一次或多次,或空格,并将它们全部返回,从而捕获这些字符的长链。
  • ([, ])+这会匹配空格或,并将其作为一组返回。

答案 4 :(得分:1)

将您的逗号更改为ABCD,如下所示:

some_text2 ='alphaA betaABCDgamma delta'

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

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

它实际上匹配每个逗号,但是作为1个字符组。 +将它变成一个贪婪的匹配,直到它不再匹配字符类中的字母。

尝试不使用+

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

[ '阿尔法',  '一个',  ',  '',  “测试版”,  '一个',  ',  'B',  ',  'C',  ',  'd',  “伽马”,  '',  ',  '',  ',  '',  '增量']