对不起,如果这是一个愚蠢的问题,我真的是R的新手。我想知道的是,有没有办法在gsub或类似功能中指定排除? 我的数据看起来像这样:(15:。0234,12:.0151),我想用另一个匹配这个(a:.b,c:.d)模式的项替换前导15。但是,只需调用gsub就可以用新模式替换前导15和小数点后面的15。简单地告诉它只替换第一次出现是不行的,因为嵌套了很多这些模式。我在想的是排除小数点后面的数字,然后是gsub中的空格 - 这是否可能?
答案 0 :(得分:3)
如果你在gsub中设置perl=TRUE
,那么你可以使用正面和负面的向前看,或者查看可能解决问题的背后,例如模式15(?=:)
将匹配15后面跟冒号(但不会匹配/替换冒号)并且不匹配任何未跟随冒号的15。模式`(?
有关详细信息,请参阅“perl”部分中的?regex
。
答案 1 :(得分:1)
我可以向您展示如何仅替换“前导15”,但是您没有提供生成测试用例的代码,您可以将这些嵌套模式替换掉,这样做有点猜测。 p>
vec <- c('15: .0234' , '12: .0151')
gsub("^15", "aa", vec)
#[1] "aa: .0234" "12: .0151"
正则表达式模式中的“^”符号表示字符串的开头。
答案 2 :(得分:1)
我会考虑将字符串解析为(a, b, c, d, ...)
向量,而不是使用正则表达式。例如,你可以这样做:
strsplit("15: .0234, 12: .0151", ": |, ")
# [[1]]
# [1] "15" ".0234" "12" ".0151"
然后使用==
,match
,%in%
,[
等功能进行替换会更容易。
完成后,您可以使用paste
将内容重新组合在一起。
答案 3 :(得分:0)
包含而不是排除可能更容易。
首先,设置一些测试数据:
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"
答案 4 :(得分:0)
这对你有用吗?
(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
?
答案 5 :(得分:0)
gsub("^15","a: .b , c: .d","15: .0234 , 12: .0151")
这会解决您的问题吗?