gsub 只是模式的一部分

gsub only part of pattern

我想使用 gsub 更正我数据中的一些名称。我希望 "R. J." 和 "A. J." 等名称的字母之间没有 space。

例如:

x <- "A. J. Burnett"

我想用gsub来匹配他名字的模式,然后去掉space:

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

但我得到:

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

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

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

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

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

您可以使用前瞻 ((?=\w\.)) 和后瞻 ((?<=\b\w\.)) 来定位此类空间并将其替换为“”。

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) 后跟通过一个单词字符和一个句点。