提取字符串的子集

时间:2017-02-18 14:32:43

标签: r string substring gsub

我的数据框中的列名包含类似于“S156 B1-1 U500(HTA-1 0).SST RMA gene.sst-rma-gene-full-Signal”的名称。我想删除括号后的所有括号(包括括号)。

我看过extract a substring in R according to a patternGetting a sub string from a vector of strings主题,但仍在疑惑。

我试过sub('(HTA-1 0).*','', colnames(data)),但输出类似于S156 B1-1 U500(。 我该如何删除括号? 感谢

2 个答案:

答案 0 :(得分:2)

一个好的正则表达式将处理这个问题。

String =  "S156 B1-1 U500 (HTA-1 0).SST RMA gene.sst-rma-gene-full-Signal"
sub("(.*?)\\(.*", "\\1", String)
[1] "S156 B1-1 U500 "

一些细节:
\\(部分查找左括号。前面的(.*?)将括号前的字符串部分转换为捕获组。句点.匹配任何字符。 .*表示零个或多个字符 - 达到后面的括号所需的数量。我使用了.*?,因为默认是"贪婪"匹配,尽可能多地采用直到 last 开括号。通过添加?,它会关闭贪婪,只会转到第一个括号。整个.*?部分位于括号(.*?)内。这就是使它成为捕获组的原因所以无论匹配什么匹配都存储在变量\ 1中  括号后的.*与字符串的其余部分匹配。因此,模式匹配字符串中的所有内容,在括号之前保存该部分。它被捕获的字符串替换。在sub内,第二个参数是替换匹配字符串的内容。我使用\\1告诉它使用变量\ 1。需要额外的反斜杠,因为反斜杠会转义字符,所以我必须转义转义字符才能说我只是指字符反斜杠。

答案 1 :(得分:2)

目前尚不清楚预期产量。如果我们要在)之后删除子字符串,请匹配)后跟字符(.*),并将其替换为)

sub("\\).*", ")", str1)
#[1] "S156 B1-1 U500 (HTA-1 0)"

或者,如果我们要从(开始删除字符串,请匹配0或更多空格(\\s*),后跟(和其他字符,并将其替换为空白({{ 1}})

""

上述正则表达式的更快替代方法是使用sub("\\s*\\(.*", "", str1) #[1] "S156 B1-1 U500"

中的stri_replace
stringi

数据

library(stringi)
stri_replace(str1, regex = "\\s*\\(.*", "")
#[1] "S156 B1-1 U500"
相关问题