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

R语言如何从含标点的字符串中用正则提取RDS16、Asthma两个值

R字符串提取解决方案

可行实现代码

方法1:提取所有双引号包裹内容(通用方案)

如果你的目标内容始终是字符串中所有被双引号包裹的内容,直接用正向断言匹配即可:

library(stringr)
# 原字符串
string <- "newdatat.scat == \"RDS16\" ~ \"Asthma\","
# 提取所有符合规则的内容
targets <- str_extract_all(string, '(?<=")[^"]+(?=")')[[1]]

运行后targets[1]即为RDS16,targets[2]即为Asthma。

方法2:按固定结构匹配(精准方案)

如果你的字符串结构固定为变量 == "值1" ~ "值2",的公式格式,可以用捕获分组定向提取:

match_res <- str_match(string, '== "([^"]+)" ~ "([^"]+)"')
val1 <- match_res[,2] # 得到RDS16
val2 <- match_res[,3] # 得到Asthma

正则逻辑说明

方法1正则(?<=")[^"]+(?=")拆解:

  • (?<="):正向后顾断言,限定当前匹配位置的前一个字符必须是双引号,双引号本身不会被计入提取结果
  • [^"]+:匹配1个及以上不是双引号的字符,就是我们要的目标内容,这里用[^"]而非.是为了避免贪婪匹配跨过多对引号
  • (?="):正向前瞻断言,限定当前匹配位置的后一个字符必须是双引号,同样不会计入提取结果

方法2正则== "([^"]+)" ~ "([^"]+)"拆解:

  • 先匹配固定前缀== ",锁定第一个目标值的起始位置
  • 第一个([^"]+):用小括号做捕获组,提取第一个双引号内的内容
  • 匹配两个目标中间的固定分隔符" ~ "
  • 第二个([^"]+):第二个捕获组,提取第二个双引号内的内容

原代码失效原因

你原来写的str_extract(string,'~."(.+)')仅匹配~之后的内容:

  • 逻辑是先匹配~,再匹配任意1个字符,再匹配双引号,最后贪婪匹配到字符串末尾
  • 完全没有覆盖到前面RDS16所在的位置,自然只能提取到和Asthma相关的内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 17:24:10