求适配R strcapture的Regex捕获组提取File与ID字段的正则方案
R语言strcapture函数提取文件名字段的正则实现
核心疑问解答
不需要为两类文件名单独编写正则模式,依托文件名中固定的结构锚点,通过可选匹配兼容命名差异,单一正则即可同时覆盖纯数字命名、带空格文本命名两类场景的提取需求。
正则设计逻辑
所有待处理文件名具备两类命名变体,核心存在固定的结构锚点,无需拆分两套匹配规则:
- 开头固定为「序号. 空格」格式:作为File字段的起始匹配边界
- File字段的终止边界存在两类固定场景:
- 纯数字命名的File(如
4301):后面紧跟TMA_Scan1_Core[标记 - 带空格的文本命名File(如
TMA A):后面紧跟_Scan1_Core[标记 - 通过可选非捕获组兼容这个差异,即可准确框定File字段的结束位置,不会多抓取冗余内容
- 纯数字命名的File(如
- 方括号内的Core信息具备固定格式
[固定值,变化数字,变化大写字母]:只需跳过开头的固定值部分,捕获后续带逗号的数字+字母组合,后续去逗号即可得到符合要求的ID值
可直接使用的正则表达式
适配R语言strcapture函数的转义规则,最终pattern为:
"^\\d+\\.\\s+(.*?)(?: TMA)?_Scan1_Core\\[\\d+,\\s*(\\d+,[A-Z])\\]"
各部分匹配含义:
^\\d+\\.\\s+:匹配开头的序号段(如1.、3.),不做捕获(.*?):第一个非贪婪捕获组,匹配从序号段结束到对应结构标记之前的所有内容,对应File字段(?: TMA)?:可选非捕获组,兼容纯数字文件名中File字段后面附带的“空格+TMA”段,不做捕获_Scan1_Core\\[\\d+,\\s*:匹配Core段的固定结构,跳过方括号内第一个固定的数值(如所有文件名里开头的1,),不做捕获(\\d+,[A-Z]):第二个捕获组,匹配方括号内剩余的「数字,大写字母」组合(如1,A、6,B),作为ID字段的原始提取内容
完整运行代码
# 提取字段,得到带逗号的原始ID out <- strcapture( pattern = "^\\d+\\.\\s+(.*?)(?: TMA)?_Scan1_Core\\[\\d+,\\s*(\\d+,[A-Z])\\]", x = test$Image, proto = list(File = "", ID = "") ) # 移除ID字段中的逗号,得到最终格式 out$ID <- gsub(",", "", out$ID)
运行结果验证
上述代码处理给定测试数据集后,输出结果与预期完全一致:
| File | ID |
|---|---|
| 4301 | 1A |
| 4302 | 6B |
| TMA A | 1A |
| TMA B | 9E |
内容的提问来源于stack exchange,提问作者JMonk
相关产品推荐
相关产品推荐

