You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 09:30:47