正则表达式匹配捕获组一次或多次

时间:2011-12-28 02:48:24

标签: python regex

我正在尝试匹配字符串中的一对数字并将它们分组捕获,但我似乎只能捕获最后一组。

Regex:
(\d\d){1,3}

输入字符串:123456 789101

比赛1:123456
  第1组:56

比赛2:789101
  第1组:01

我想要的是捕获所有这样的组: 比赛1:123456
  第1组:12   第2组:34
  第3组:56

*更新
看起来Python不允许你捕获多个组,例如在.NET中你可以在一次传递中捕获所有组,因此re.findall('\ d \ d','123456')可以完成这项工作。

4 个答案:

答案 0 :(得分:6)

只使用一个正则表达式就无法做到这一点。这是一个特殊的计数案例,你只能使用正则表达式模式。 \ d \ d会得到你:

第1组:12 第2组:23 第3组:34 ......

python中的

regex库带有一个非重叠的例程,即re.findall(),它可以解决这个问题。如:

     re.findall('\d\d', '123456')

将返回['12', '34', '56']

答案 1 :(得分:2)

(\d{2})+(\d)?

我不确定python如何处理匹配,但这就是我要做的事情

答案 2 :(得分:2)

试试这个:

import re
re.findall(r'\d\d','123456')

答案 3 :(得分:1)

这是你想要的吗? :

import re

regx = re.compile('(?:(?<= )|(?<=\A)|(?<=\r)|(?<=\n))'
                  '(\d\d)(\d\d)?(\d\d)?'
                  '(?= |\Z|\r|\n)')

for s in ('   112233  58975  6677  981  897899\r',
          '\n123456 4433 789101 41586 56 21365899 362547\n',
          '0101 456899 1 7895'):
    print repr(s),'\n',regx.findall(s),'\n'

结果

'   112233  58975  6677  981  897899\r' 
[('11', '22', '33'), ('66', '77', ''), ('89', '78', '99')] 

'\n123456 4433 789101 41586 56 21365899 362547\n' 
[('12', '34', '56'), ('44', '33', ''), ('78', '91', '01'), ('56', '', ''), ('36', '25', '47')] 

'0101 456899 1 7895' 
[('01', '01', ''), ('45', '68', '99'), ('78', '95', '')]