如何用stringr::str_extract提取WR/CM/SPIN后的关联数字?
用stringr::str_extract提取WR/CM/SPIN对应关联数字
需求背景
用户有一批推文数据,格式示例如下:
WR 198 CM 23 SPIN 34 WR:22 CM:7 SPIN:0 WR 96 CM 17 SPIN 8 WR:82 CM:9 SPIN:10 WR - 206💪 CM - 38💥 SPIN - 18💯 WR - 140 CM - 18 Spin - 12 WR 62 CM 11 SPIN 4 WR- CM- Spin_ WR - 67 CM - 18 Spin - 5 WR 38 CM 2 SPIN 0
这类推文的共同结构是:WR/CM/SPIN(大小写不限)后跟随空格或非字母数字字符,再关联一个数字。需要实现一个函数f,接收文本和目标标识(WR/CM/SPIN之一),返回对应的关联数字。
实现方案
完全可以用stringr::str_extract(或配合str_match)实现该需求,核心是构造适配所有格式的正则表达式。
正则表达式逻辑
正则需要覆盖以下场景:
- 忽略大小写匹配目标标识(如
Spin/spin都能匹配) - 匹配标识后的任意分隔符:空格、冒号、连字符、下划线等非字母数字字符(包括分隔符前后的空格)
- 精准捕获后续的连续数字(无数字时返回
NA)
对应的正则模板为:
paste0("(?i)", target, "\\W*?(\\d+)")
各部分解释:
(?i):开启不区分大小写匹配模式target:传入的目标标识(如WR/CM/SPIN)\\W*?:非贪婪匹配0个或多个非字母数字字符,避免过度匹配无关内容(\\d+):捕获1个或多个连续数字,这就是最终要提取的目标内容
函数实现
方式一:用str_extract两次提取
library(stringr) f <- function(text, target) { pattern <- paste0("(?i)", target, "\\W*?(\\d+)") # 先匹配完整符合规则的片段 match_result <- str_extract(text, pattern) # 从片段中提取数字部分 str_extract(match_result, "\\d+") }
方式二:用str_match直接获取捕获组(更简洁)
library(stringr) f <- function(text, target) { pattern <- paste0("(?i)", target, "\\W*?(\\d+)") # str_match返回矩阵,第二列是第一个捕获组的内容 str_match(text, pattern)[, 2] }
测试验证
# 示例1 f("WR 198 CM 23 SPIN 34", 'WR') # 输出:"198" # 示例2 f("WR 198 CM 23 SPIN 34", 'CM') # 输出:"23" # 示例3 f("SPIN - 18💯", 'SPIN') # 输出:"18" # 示例4 f("WR:82 CM:9 SPIN:10", "WR") # 输出:"82" # 无数字的情况 f("WR-", "WR") # 输出:NA
上述函数可适配用户提供的所有推文格式,正确提取对应数字。
内容的提问来源于stack exchange,提问作者Demetri Pananos
相关产品推荐
相关产品推荐

