无法使用R中的gsub用反向引用替换字符串

Unable to replace string with back reference using gsub in R

我正在尝试使用 R 中的正则表达式替换字符向量中的一些文本,如果括号内有一组字母,则括号内容将替换整个内容。因此,给定输入:

tst <- c("85", "86 (TBA)", "87 (LAST)")

我想要的输出相当于 c("85", "TBA", "LAST")

我试过 gsub("\(([[:alpha:]])\)", "\1", tst) 但它没有替代任何东西。我需要在此处的正则表达式中更正什么?

gsub("(?=.*\([^)]*\)).*\(([^)]*)\)", "\1", tst, perl=TRUE)
## [1] "85"   "TBA"  "LAST"

您可以通过 尝试 this.See demo.Replace。

https://regex101.com/r/sH8aR8/38

我想你想要

gsub(".*\(([[:alpha:]]+)\)", "\1", tst)
# [1] "85"   "TBA"  "LAST"

您的第一个表达式试图准确匹配一个字母字符,而不是一个或多个。我还添加了“.*”来捕获字符串的开头部分,以便它也被替换,否则,它将保持不变。

以下方法可行。请注意, 括号内的空格可能有问题

A<-sapply(strsplit(tst," "),tail,1)
B<-gsub("\(|\)", "", A)

我更喜欢纯正则表达式的答案。我正在展示一个使用我维护的 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"