Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python正则表达式:在或中捕获组_Python_Regex - Fatal编程技术网

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

我正在使用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?'
)(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
  • ([0-9]{4})
    -匹配并捕获到组1中的四位数字
:

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

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