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

R语言正则提取数字字母序列并统计对应数值总和

解决方法

1. 正确拆分字符串

你原有的正则模式无法逐个提取每个数字+w/p单元,因为([0-9]+w)*([0-9]+p)*会匹配整个字符串的组合,而非单个单元。改用匹配单个单元的正则"\\d+[wp]",结合stringr包的str_extract_all函数就能得到预期的拆分结果:

library(stringr)
s <- c("2w", "1p", "3w1p3w", "2p12w2p3w")
split_list <- str_extract_all(s, "\\d+[wp]")
split_list

输出结果:

[[1]]
[1] "2w"

[[2]]
[1] "1p"

[[3]]
[1] "3w" "1p" "3w"

[[4]]
[1] "2p"  "12w" "2p"  "3w"

2. 统计w和p的数值总和

基于拆分后的结果,我们可以通过两种方式计算每个字符串中w、p对应的数值总和:

方法一:基础R实现

# 定义函数计算单个字符串的w、p总和
calc_sum <- function(x) {
  parts <- strsplit(x, "(?=[wp])", perl = TRUE)[[1]]
  w_sum <- sum(as.numeric(gsub("w", "", grep("w", parts, value = TRUE))), na.rm = TRUE)
  p_sum <- sum(as.numeric(gsub("p", "", grep("p", parts, value = TRUE))), na.rm = TRUE)
  return(c(w = w_sum, p = p_sum))
}

# 应用到整个向量并转为数据框
sum_matrix <- t(sapply(s, calc_sum))
result_df <- data.frame(s = s, sum_matrix)
result_df

方法二:tidyverse简洁实现

library(tidyverse)
tibble(s = s) |>
  mutate(parts = str_extract_all(s, "\\d+[wp]")) |>
  unnest(parts) |>
  mutate(
    type = str_extract(parts, "[wp]"),
    value = as.numeric(str_extract(parts, "\\d+"))
  ) |>
  group_by(s) |>
  summarise(
    w = sum(value[type == "w"], na.rm = TRUE),
    p = sum(value[type == "p"], na.rm = TRUE)
  ) |>
  ungroup()

两种方法最终都会得到目标数据框:

s  w p
1        2w  2 0
2        1p  0 1
3    3w1p3w  6 1
4 2p12w2p3w 15 4

关于gregexec的问题说明

你之前用gregexec得到的结果不符合预期,是因为你的正则模式用了*修饰捕获组,只会返回最后一个匹配的捕获组内容,而非所有单元。str_extract_all是专门提取所有匹配单个模式的工具,更适合这类场景。

内容的提问来源于stack exchange,提问作者tflutre

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 09:52:33