如何排除某些东西被gsub()取代

时间:2012-04-06 03:04:40

标签: r replace design-patterns matching gsub

对不起,如果这是一个愚蠢的问题,我真的是R的新手。我想知道的是,有没有办法在gsub或类似功能中指定排除? 我的数据看起来像这样:(15:。0234,12:.0151),我想用另一个匹配这个(a:.b,c:.d)模式的项替换前导15。但是,只需调用gsub就可以用新模式替换前导15和小数点后面的15。简单地告诉它只替换第一次出现是不行的,因为嵌套了很多这些模式。我在想的是排除小数点后面的数字,然后是gsub中的空格 - 这是否可能?

6 个答案:

答案 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")

这会解决您的问题吗?