Python正则匹配Fddd/FSC-ddd格式后提取数字分组失效问题
问题描述
现有一组表示文件名的字符串,示例如下:
'20220213-0000-FSC-814-SC_VIRG_REFBAL_PRES_NPMINMAX-v1.xml' '20220213-0000-F814-SC_VIRG_REFBAL_PRES_NPMINMAX-v1.xml'
需要使用re.search方法匹配符合以下两种规则的子串:
Fddd:字符F后紧跟3位数字(d代表数字)FSC-ddd:字符串FSC-后紧跟3位数字
当前编写的正则匹配代码如下:
type_match = re.search(r'(F(\d{3}))|(FSC-(\d{3}))', string)
预期目标是匹配到结果后,仅提取其中的三位数字部分。原本使用int(type_match.group(1))取值,但在正则中加入|或分支逻辑后,该取值方式无法正常工作:匹配FSC-814这类结果时,拿不到对应的数字值。
问题原因
原正则一共设置了4个捕获组,两个分支匹配成功时,3位数字所在的捕获组序号不固定:
- 匹配
Fddd格式时,数字保存在第2个捕获组 - 匹配
FSC-ddd格式时,数字保存在第4个捕获组
固定取group(1)自然无法覆盖两种场景。
解决方法
调整正则结构,使用非捕获组统合两种前缀规则,仅保留3位数字的捕获组,这样无论匹配哪个分支,数字都固定在第1个捕获组,直接取值即可。修改后的代码如下:
import re s1 = '20220213-0000-FSC-814-SC_VIRG_REFBAL_PRES_NPMINMAX-v1.xml' s2 = '20220213-0000-F814-SC_VIRG_REFBAL_PRES_NPMINMAX-v1.xml' # 正则中(?:FSC-|F)为非捕获组,仅匹配前缀不生成分组,后面的(\d{3})是唯一捕获组 type_match = re.search(r'(?:FSC-|F)(\d{3})', s1) num = int(type_match.group(1)) # 两个示例文件都能正确取到814
该写法逻辑更简洁,不需要额外判断分支,取值逻辑统一。
内容的提问来源于stack exchange,提问作者Ryszard Eggink
相关产品推荐
相关产品推荐

