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
相关产品推荐
相关产品推荐

