gsub只是模式的一部分

时间:2016-05-24 22:35:50

标签: r string gsub

我想使用gsub来更正我数据中的某些名称。我想要诸如" R之类的名字。 J&#34。和" A. J&#34。字母之间没有空格。

例如:

x <- "A. J. Burnett"

我想使用gsub匹配他的名字的模式,然后删除空格:

gsub("[A-Z]\\.\\s[A-Z]\\.", "[A-Z]\\.[A-Z]\\.", x)

但我明白了:

[1] "[A-Z].[A-Z]. Burnett"

显然,不是[A-Z],而是我想要原始名称中的实际字母。我怎么能这样做?

2 个答案:

答案 0 :(得分:12)

通过在(...)中包含模式来使用捕获组,并使用\\1\\2等参考捕获的模式。在这个例子中:

x <- "A. J. Burnett"
gsub("([A-Z])\\.\\s([A-Z])\\.", "\\1.\\2.", x)
[1] "A.J. Burnett"

另请注意,在替换中,您不需要逃避.字符,因为它们在那里没有特殊含义。

答案 1 :(得分:2)

您可以使用前瞻((?=\\w\\.))和后瞻((?<=\\b\\w\\.))来定位此类空格,并将其替换为&#34;&#34;。

x <- c("A. J. Burnett", "Dr. R. J. Regex")
gsub("(?<=\\b\\w\\.) (?=\\w\\.)", "", x, perl = TRUE)
# [1] "A.J. Burnett"   "Dr. R.J. Regex"

前瞻匹配单词字符(\\w),后跟句点(\\.),后卫匹配单词边界(\\b)后跟一个单词字符和句号。