R语言如何识别数据框每行中字母数字交替的特定字符串
R语言实现方案
直接用正则表达式匹配目标格式字符串即可,无需生成全量排列组合,万行级数据可毫秒级出结果。
核心匹配规则
目标串符合「字母-数字-字母-数字-字母-数字」交替规律,示例中的匹配串存在前3位、后3位中间带单个空格的形式,编写正则时兼容可选空格即可:
- 正则表达式:
`[A-Z][0-9][A-Z]\\s?[0-9][A-Z][0-9]` - 规则拆解:按顺序匹配1个大写字母、1个数字、1个大写字母、0或1个空白字符、1个数字、1个大写字母、1个数字,自动过滤连续字母、连续数字、长度不符的无效串。
完整实现代码
# 构造示例数据集 var1 = c("name1", "name2 A2L 7O1", "1726A") var2 = c("B6U 5T3", "dog55", "name name K8GG 2H3") var3 = c("cat J5C 99W3", "A37L2" ,"cat K8Y 9S2 dog") problem_data = data.frame(var1, var2, var3) # 加载正则处理包,未安装可先运行 install.packages("stringr") library(stringr) # 逐行提取符合规则的字符串存入var4 problem_data$var4 <- apply(problem_data, 1, function(row) { row_content <- paste(row, collapse = " ") str_extract(row_content, "[A-Z][0-9][A-Z]\\s?[0-9][A-Z][0-9]") })
运行后得到的结果和预期完全一致:
> problem_data var1 var2 var3 var4 1 name1 B6U 5T3 cat J5C 99W3 B6U 5T3 2 name2 A2L 7O1 dog55 A37L2 A2L 7O1 3 1726A name name K8GG 2H3 cat K8Y 9S2 dog K8Y 9S2
场景适配调整
- 若匹配串包含小写字母,可将正则中
[A-Z]替换为[A-Za-z],或在str_extract中加入参数regex(..., ignore_case = TRUE)忽略大小写 - 若匹配串为无空格连写格式(如
B6U5T3),现有正则可直接命中,无需修改 - 若单行存在多个符合规则的串,将
str_extract替换为str_extract_all即可提取全部匹配结果
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

