R语言中使用条件正则表达式提取%符号前后目标文本
处理带%分隔符的地址向量需求解决方案
问题背景
现有一个地址字符向量,每个元素通过%分隔左右两部分,示例代码如下:
ShippingStreet <- c("123 Main St%234 Center Street", "%555 Folsom Street", "59 Hyde Street%")
需求规则:
- 若
%左侧有内容,保留左侧部分 - 若
%左侧无内容(即字符串以%开头),保留右侧部分
预期输出:
123 Main St 555 Folsom Street 59 Hyde Street
原代码问题分析
你之前尝试的正则表达式存在两处关键问题:
- R语言中使用正则不需要添加首尾的
/分隔符,gm模式也不需要通过这种方式声明 - 条件正则的匹配逻辑未准确对应需求,导致无法正确匹配需要删除的内容
原代码:
pattrn_pct <- "/(?(?=%)..(%.*$)|(^.*%))/gm" gsub(pattrn_pct, "", ShippingStreet, perl=T)
正确解决方法
方法一:简洁正则替换(推荐)
直接匹配需要删除的部分,用空字符串替换即可:
gsub("^%|%.*$", "", ShippingStreet)
运行结果:
[1] "123 Main St" "555 Folsom Street" "59 Hyde Street"
正则逻辑说明:
^%:匹配字符串开头的%,替换为空后保留右侧内容%.*$:匹配%及其后面的所有字符,替换为空后保留左侧内容|用于合并两种匹配场景,gsub会自动对每个元素匹配对应模式
方法二:拆分后逻辑判断
通过strsplit拆分每个元素,再根据左侧内容是否为空选择对应部分:
sapply(strsplit(ShippingStreet, "%"), function(x) { # nzchar() 判断字符串是否非空 if(nzchar(x[1])) x[1] else x[2] })
该方法逻辑直观,适合对正则不太熟悉的场景,运行结果与方法一一致。
内容的提问来源于stack exchange,提问作者xtufer
相关产品推荐
相关产品推荐

