python正则表达式:在OR中捕获组

时间:2015-12-27 16:07:18

标签: python regex

我使用python和re模块来解析一些字符串并提取与前缀相关联的4位数代码。以下是我需要解析的两个字符串示例:

str1 = "random stuff tokenA1234 more stuff"
str2 = "whatever here tokenB5678 tokenA0123 and more there"

tokenA和tokenB是前缀,1234,5678,0123是我需要抓取的数字。令牌A和B只是一个例子。前缀可以是地址http://domain.com/(tokenA)或类似Id:'[Ii]d:?\s?')(tokenB)的字符串。

我的正则表达式如下:

re.findall('.*?(?:tokenA([0-9]{4})|tokenB([0-9]{4})).*?', str1)

解析上面的2个字符串时,我得到:

[('1234','')]
[('','5678'),('0123','')]

我想简单地获取['1234']['5678','0123']而不是元组。 如何修改正则表达式来实现呢?提前谢谢。

2 个答案:

答案 0 :(得分:1)

只需这样做:

re.findall(r"token[AB](\d{4})", s)

[AB]放入字符类中,以便它匹配AB

答案 1 :(得分:1)

因为你的正则表达式中有超过1个捕获组,所以你得到了元组。见re.findall reference

  

如果模式中存在一个或多个组,将返回组列表;如果模式有多个组,这将是元组列表。

因此,解决方案仅使用一个捕获组

由于您的正则表达式中有令牌,因此您可以在组内使用它们。由于只有令牌不同,([0-9]{4})部分对于两者都是常见的,只需在放入非捕获组的令牌之间使用交替运算符:

(?:tokenA|tokenB)([0-9]{4})
^^^^^^^^^^^^^^^^^

正则表达式意味着:

  • (?:tokenA|tokenB) - 匹配但不捕获tokenAtokenB
  • ([0-9]{4}) - 匹配并捕获到第1组四位数字

IDEONE demo

import re
s = "tokenA1234tokenB34567"
print(re.findall(r'(?:tokenA|tokenB)([0-9]{4})', s)) 

结果:['1234', '3456']