无法使用R中的gsub替换带后引用的字符串

时间:2015-01-09 06:53:47

标签: regex r

我正在尝试使用R中的regex替换字符向量中的某些文本,其中如果括号内有一组字母,则括号内容将替换整个内容。所以给出了输入

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

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

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

4 个答案:

答案 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

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

答案 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"