python正则表达式:在或中捕获组
我正在使用python和python正则表达式:在或中捕获组,python,regex,Python,Regex,我正在使用python和re模块解析一些字符串,并提取与前缀关联的4位代码。下面是我必须解析的两个字符串示例: str1 = "random stuff tokenA1234 more stuff" str2 = "whatever here tokenB5678 tokenA0123 and more there" tokenA和tokenB是前缀,123456780123是我需要获取的数字。令牌A和B只是这里的一个示例。前缀可以类似于地址(tokenA)或类似于Id:('[Ii]d:?\s
re
模块解析一些字符串,并提取与前缀关联的4位代码。下面是我必须解析的两个字符串示例:
str1 = "random stuff tokenA1234 more stuff"
str2 = "whatever here tokenB5678 tokenA0123 and more there"
tokenA和tokenB是前缀,123456780123是我需要获取的数字。令牌A和B只是这里的一个示例。前缀可以类似于地址
(tokenA)或类似于Id:
('[Ii]d:?\s?'
)(tokenB)的字符串
我的正则表达式看起来像:
re.findall('.*?(?:tokenA([0-9]{4})|tokenB([0-9]{4})).*?', str1)
解析上面的2个字符串时,我得到:
[('1234','')]
[('','5678'),('0123','')]
我只想得到['1234']
或['5678','0123']
而不是一个元组。
如何修改正则表达式以实现这一点?提前感谢。只需执行以下操作:
re.findall(r"token[AB](\d{4})", s)
将
[AB]
放在字符类中,使其匹配a
或B
由于正则表达式中有多个捕获组,因此会得到元组。见:
如果模式中存在一个或多个组,返回组列表;如果模式有多个组,这将是一个元组列表
因此,解决方案是只使用一个捕获组
因为您的正则表达式中有令牌,所以可以在组中使用它们。由于只有令牌不同,([0-9]{4})
部分对于两者都是通用的,只需在放入非捕获组的令牌之间使用交替运算符:
regex是指:
-匹配但不捕获(?:令牌A |令牌B)
或令牌A
令牌B
-匹配并捕获到组1中的四位数字([0-9]{4})
['1234','3456']
(?:tokenA|tokenB)([0-9]{4})
^^^^^^^^^^^^^^^^^
import re
s = "tokenA1234tokenB34567"
print(re.findall(r'(?:tokenA|tokenB)([0-9]{4})', s))