如何使用R基础包通过捕获组仅替换字符串部分内容?
问题原因与解决方案
你的问题出在正则表达式的分组匹配逻辑上:
- 你使用的
(\\w)(\\.)(\\d+)中,\\w仅匹配单个单词字符(字母、数字、下划线),所以这个模式只命中了字符串末尾的T.105片段:- 分组
\\1对应单个字符T - 分组
\\3对应数字105
- 分组
- 用
\\1替换时,是把T.105替换成T,刚好得到LCZBDT(这是巧合,正则逻辑本身不严谨) - 用
\\3替换时,是把T.105替换成105,原字符串的LCZBD加上新替换的105,就得到了LCZBD105
下面是不依赖tidyverse的基础R正确实现:
方法1:修正正则表达式
针对你的需求,精准匹配前缀和后缀:
# 提取"LCZBDT" gsub(x = "LCZBDT.105", pattern = "^(\\w+)\\.\\d+$", replacement = "\\1") # 提取"105" gsub(x = "LCZBDT.105", pattern = "^\\w+\\.(\\d+)$", replacement = "\\1")
方法2:用strsplit分割字符串
以.为分隔符拆分字符串后取对应部分:
# 提取"LCZBDT" strsplit("LCZBDT.105", "\\.")[[1]][1] # 提取"105" strsplit("LCZBDT.105", "\\.")[[1]][2]
方法3:用sub简化替换(更高效)
因为字符串仅含一个.,用sub(仅替换一次匹配)比gsub更合适:
# 提取"LCZBDT" sub(x = "LCZBDT.105", pattern = "\\.\\d+$", replacement = "") # 提取"105" sub(x = "LCZBDT.105", pattern = "^\\w+\\.", replacement = "")
内容的提问来源于stack exchange,提问作者Matthieu Gousseff
相关产品推荐
相关产品推荐

