R语言字符串处理:提取P前缀编码并复制到对应分组括号前
R语言字符串处理:补全P编码对应区间前缀
需求说明
输入字符串:
input_string <- "P24928 [1909-1922]; [1923-1936]; P08775 [1909-1922]; [1923-1936]"
需要提取所有P#####格式的编码,将每个编码补到其对应的第二个方括号区间前方,最终得到目标字符串:
"P24928 [1909-1922]; P24928 [1923-1936]; P08775 [1909-1922]; P08775 [1923-1936]"
实现方案
通过正则表达式的捕获组功能可快速完成替换,以下提供两种实现方式:
方式一:使用stringr包(推荐,语法更直观)
# 若未安装stringr包,先执行:install.packages("stringr") library(stringr) input_string <- "P24928 [1909-1922]; [1923-1936]; P08775 [1909-1922]; [1923-1936]" # 正则捕获组替换 output_string <- str_replace_all(input_string, "(P\\d{5}) (\\[.*?\\]); (\\[.*?\\])", "\\1 \\2; \\1 \\3") # 输出结果 print(output_string)
方式二:使用基础R的gsub函数
input_string <- "P24928 [1909-1922]; [1923-1936]; P08775 [1909-1922]; [1923-1936]" # 启用Perl正则语法支持非贪婪匹配 output_string <- gsub("(P\\d{5}) (\\[.*?\\]); (\\[.*?\\])", "\\1 \\2; \\1 \\3", input_string, perl = TRUE) # 输出结果 print(output_string)
正则逻辑说明
(P\\d{5}):捕获第一个分组,匹配P开头加5位数字的编码格式(\\[.*?\\]):捕获第二个分组,匹配第一个带区间的方括号内容(.*?为非贪婪匹配,避免跨区间匹配);:匹配分隔用的分号加空格(\\[.*?\\]):捕获第三个分组,匹配未带编码的第二个区间方括号内容- 替换模板
\\1 \\2; \\1 \\3:将第三个分组前补上第一个分组捕获到的P编码,实现对应区间的编码补全
内容的提问来源于stack exchange,提问作者John H
相关产品推荐
相关产品推荐

