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