我正在尝试使用R中的regex替换字符向量中的某些文本,其中如果括号内有一组字母,则括号内容将替换整个内容。所以给出了输入
tst <- c("85", "86 (TBA)", "87 (LAST)")
我想要的输出相当于c("85", "TBA", "LAST")
我试过了gsub("\\(([[:alpha:]])\\)", "\\1", tst)
,但它并没有取代任何东西。我需要在正则表达式中纠正什么?
答案 0 :(得分:5)
我想你想要
gsub(".*\\(([[:alpha:]]+)\\)", "\\1", tst)
# [1] "85" "TBA" "LAST"
您的第一个表达式是尝试匹配一个字母字符而不是一个或多个字符。我还添加了&#34;。*&#34; <> p>。捕获字符串的开头部分,以便它也被替换,否则,它将保持不变。
答案 1 :(得分:1)
gsub("(?=.*\\([^)]*\\)).*\\(([^)]*)\\)", "\\1", tst, perl=TRUE)
## [1] "85" "TBA" "LAST"
你可以尝试这个。参见demo。替换\1
。
答案 2 :(得分:1)
以下情况可行。请注意,括号内的 中的空格可能存在问题
A<-sapply(strsplit(tst," "),tail,1)
B<-gsub("\\(|\\)", "", A)
答案 3 :(得分:1)
我更喜欢纯粹的正则表达式答案。我正在使用我坚持的 qdapRegex 包显示解决方案,因为结果非常快速且易于记忆和概括。它拉出括号中的字符串,然后用原始值替换任何NA
(无括号)。请注意,结果是一个列表,您需要使用unlist
来匹配您想要的输出。
library(qdpRegex)
m <- rm_round(tst, extract=TRUE)
m[is.na(m)] <- tst[is.na(m)]
## [[1]]
## [1] "85"
##
## [[2]]
## [1] "TBA"
##
## [[3]]
## [1] "LAST"