R语言sub()函数星号通配符失效原因及替换方法咨询
问题根源:你误解了正则表达式里
*的作用! 你遇到的问题核心是对正则表达式中*通配符的用法理解错了——*不是用来匹配任意字符的,它是用来修饰前面的字符,表示匹配该字符0次或多次。
为什么你的代码没效果?
你写的pattern = "_*",实际是告诉R:「找0个或多个连续的下划线」。而正则引擎在匹配时会优先选择最「早」的匹配项,它首先会匹配字符串开头的空内容(也就是0个下划线的情况),sub()函数默认只替换第一个匹配项,所以相当于把空内容替换成空,自然整个字符串毫无变化。
正确的写法:匹配下划线及之后的所有内容
要移除下划线及其后的任意文本,你需要的是:
- 先匹配下划线
_ - 再匹配下划线之后的任意字符(0个或多个),这里用
.*(.表示任意单个字符,*表示匹配前面的字符0次或多次)
所以正确的代码应该是:
x <- c("a_101", "a_275", "b_133", "b_277") sub(pattern = "_.*", replacement = "", x = x)
执行后输出就是你想要的:
[1] "a" "a" "b" "b"
补充说明
- 如果你的字符串里有多个下划线,比如
"a_b_101",sub("_.*")会匹配第一个下划线之后的所有内容,直接得到"a";如果只想保留最后一个下划线之前的内容,那需要用更精确的正则(比如sub("_[^_]*$", "", x)),不过你的场景里这个需求不存在~ sub()只会替换第一个匹配项,刚好适合你的单下划线场景;如果要替换所有匹配项才用gsub()。
内容的提问来源于stack exchange,提问作者Dr. Beeblebrox
相关产品推荐
相关产品推荐

