如何用gsub为无空格的-后添加空格?附R语言示例
用R的gsub解决短横线后无空格时添加空格的问题
直接解决方案代码
不需要用ifelse,直接用gsub就能批量处理所有符合条件的字符串,同时保留已经格式正确的内容:
library(dplyr) # 构造示例数据 id = c(1,2,3,4,5,6,7,8,9,10) FiscalYear = c("2012 -2013", "2012 -2013", "2012 -2013", "2012 -2013", "2012 -2013", "2014 - 2015", "2014 - 2015", "2014 - 2015", "2014 - 2015", "2014 - 2015") df = data.frame(id, FiscalYear) # 批量修正格式 df_new = df %>% mutate(FiscalYear = gsub("(-)([^\\s])", "\\1 \\2", FiscalYear))
第二种写法(需启用Perl正则引擎)
如果想用更直观的逻辑匹配「后面没有空格的短横线」,可以用正向否定预查,记得加perl = TRUE:
df_new = df %>% mutate(FiscalYear = gsub("-(?!\\s)", "- ", FiscalYear, perl = TRUE))
gsub函数及正则解释
gsub基础用法:
gsub(pattern, replacement, x)是R的全局字符串替换函数,会把x中所有匹配pattern的内容替换成replacement,非匹配内容保持不变。pattern:要匹配的正则表达式replacement:替换后的内容x:待处理的字符串/字符串向量
第一种正则逻辑:
(-)([^\\s])(-):捕获第一个分组,就是目标短横线-([^\\s]):捕获第二个分组,代表「非空白字符」(^在方括号里表示取反,\\s指代空格、制表符等空白内容)\\1 \\2:替换时保留第一个分组的短横线,后面加空格,再拼接第二个分组的内容,实现给短横线和后续非空格字符之间插入空格的效果。
第二种正则逻辑:
-(?!\\s)-(?!\\s):这是正向否定预查,意思是「匹配短横线-,且该短横线后面没有紧跟空白字符」- 替换成
-,直接给符合条件的短横线补空格,逻辑更直观,但需要Perl正则引擎支持,因此要添加perl = TRUE参数。
为什么str_pad不适用?
str_pad的作用是给字符串的开头、结尾或两侧固定填充字符,它无法识别字符串中间的特定模式(比如短横线后面有没有空格),完全不适合这类中间内容的修正需求。
内容的提问来源于stack exchange,提问作者Ed_Gravy
相关产品推荐
相关产品推荐

