0

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

4

6 回答 6

4

如果您perl=TRUE在 gsub 中设置,那么您可以使用正面和负面的前瞻或后视,这可能会解决您的问题,例如,模式15(?=:)将匹配 15,后跟冒号(但不会匹配/替换冒号)并且不会匹配任何后面没有冒号的 15s。模式`(?

有关更多详细信息,请参见?regex“perl”部分。

于 2012-04-06T16:29:48.780 回答
1

我可以向您展示如何仅替换“前 15 位”,但您没有提供生成测试用例的代码,在这些测试用例中您是否替换了这些嵌套模式,所以这有点猜测。

 vec <- c('15: .0234' , '12: .0151')
 gsub("^15", "aa", vec)
#[1] "aa: .0234" "12: .0151"

正则表达式模式中的“^”符号表示字符串的开头。

于 2012-04-06T03:38:08.543 回答
1

(a, b, c, d, ...)我会考虑将字符串解析为向量,而不是使用正则表达式。例如,您可以这样做:

strsplit("15: .0234, 12: .0151", ": |, ")
# [[1]]
# [1] "15"     ".0234" "12"    ".0151"

==那么使用, match, %in%,[等函数进行替换应该会容易得多。

完成后,您可以使用paste.

于 2012-04-06T17:45:35.157 回答
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"
于 2012-04-06T03:34:49.927 回答
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吗?

于 2012-04-06T03:35:03.373 回答
0
gsub("^15","a: .b , c: .d","15: .0234 , 12: .0151")

这会解决你的问题吗?

于 2012-04-06T04:31:10.690 回答