抱歉,如果这是一个愚蠢的问题,我对 R 真的很陌生。我想知道的是,有没有办法在 gsub 或类似函数中指定排除项?我的数据看起来像这样:(15: .0234 , 12: .0151),我想用与 (a: .b , c: .d) 模式匹配的另一个项目替换前导 15。但是,只需调用 gsub 就会用新模式替换前导 15 和小数点后面的 15。简单地告诉它只替换第一次出现是行不通的,因为嵌套了很多这些模式。我在想的是从 gsub 中排除小数点后面的数字和空格 - 这甚至可能吗?
6 回答
如果您perl=TRUE
在 gsub 中设置,那么您可以使用正面和负面的前瞻或后视,这可能会解决您的问题,例如,模式15(?=:)
将匹配 15,后跟冒号(但不会匹配/替换冒号)并且不会匹配任何后面没有冒号的 15s。模式`(?
有关更多详细信息,请参见?regex
“perl”部分。
我可以向您展示如何仅替换“前 15 位”,但您没有提供生成测试用例的代码,在这些测试用例中您是否替换了这些嵌套模式,所以这有点猜测。
vec <- c('15: .0234' , '12: .0151')
gsub("^15", "aa", vec)
#[1] "aa: .0234" "12: .0151"
正则表达式模式中的“^”符号表示字符串的开头。
(a, b, c, d, ...)
我会考虑将字符串解析为向量,而不是使用正则表达式。例如,您可以这样做:
strsplit("15: .0234, 12: .0151", ": |, ")
# [[1]]
# [1] "15" ".0234" "12" ".0151"
==
那么使用, match
, %in%
,[
等函数进行替换应该会容易得多。
完成后,您可以使用paste
.
包含而不是排除可能更容易。
首先,设置一些测试数据:
test <- c("15: .0234 , 12: .0151")
在字符串开头替换 15 的示例(^ 执行此操作)。
gsub("^15","x",test)
[1] "x: .0234 , 12: .0151"
一个更通用的示例,用于替换字符串开头的任何数字。
gsub("^([0-9]+)","x",test)
[1] "x: .0234 , 12: .0151"
删除任何数字后跟冒号 (:) 并替换为 x 和冒号的示例
gsub("([0-9]+):","x:",test)
[1] "x: .0234 , x: .0151"
这对你有用吗?
(foo <- "15: .0234 , 12: .0151")
# "15: .0234 , 12: .0151"
(bar <- "a: .b , c: .d")
# "a: .b , c: .d"
gsub("^15",bar, foo)
# "a: .b , c: .d: .0234 , 12: .0151"
如果没有,请提供一些示例数据以及显示您的最终目标的示例对象。一串你的数据可能是什么样子的,它是句子“简单地告诉它只替换第一次出现是行不通的,因为有很多嵌套的模式”对我来说有点不清楚。您想在字符串中找到“15”,但如果它位于结尾或以小数点开头的数字的一部分,则不是?
你读过帮助文件?gsub
吗?
gsub("^15","a: .b , c: .d","15: .0234 , 12: .0151")
这会解决你的问题吗?