我的数据框中的列名包含类似于“S156 B1-1 U500(HTA-1 0).SST RMA gene.sst-rma-gene-full-Signal”的名称。我想删除括号后的所有括号(包括括号)。
我看过extract a substring in R according to a pattern和Getting a sub string from a vector of strings主题,但仍在疑惑。
我试过sub('(HTA-1 0).*','', colnames(data))
,但输出类似于S156 B1-1 U500(。
我该如何删除括号?
感谢
答案 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"