我使用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']
而不是元组。
如何修改正则表达式来实现呢?提前谢谢。
答案 0 :(得分:1)
只需这样做:
re.findall(r"token[AB](\d{4})", s)
将[AB]
放入字符类中,以便它匹配A
或B
答案 1 :(得分:1)
因为你的正则表达式中有超过1个捕获组,所以你得到了元组。见re.findall
reference:
如果模式中存在一个或多个组,将返回组列表;如果模式有多个组,这将是元组列表。
因此,解决方案仅使用一个捕获组。
由于您的正则表达式中有令牌,因此您可以在组内使用它们。由于只有令牌不同,([0-9]{4})
部分对于两者都是常见的,只需在放入非捕获组的令牌之间使用交替运算符:
(?:tokenA|tokenB)([0-9]{4})
^^^^^^^^^^^^^^^^^
正则表达式意味着:
(?:tokenA|tokenB)
- 匹配但不捕获tokenA
或tokenB
([0-9]{4})
- 匹配并捕获到第1组四位数字import re
s = "tokenA1234tokenB34567"
print(re.findall(r'(?:tokenA|tokenB)([0-9]{4})', s))
结果:['1234', '3456']