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

如何用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)实现该需求,核心是构造适配所有格式的正则表达式。

正则表达式逻辑

正则需要覆盖以下场景:

  1. 忽略大小写匹配目标标识(如Spin/spin都能匹配)
  2. 匹配标识后的任意分隔符:空格、冒号、连字符、下划线等非字母数字字符(包括分隔符前后的空格)
  3. 精准捕获后续的连续数字(无数字时返回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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 03:25:48