提取字符串的子集

extracting a subset of a string

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

我看过 extract a substring in R according to a pattern and 个主题,但仍然想知道。

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

一个好的正则表达式可以解决这个问题。

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

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

不清楚预期的输出。如果我们要去掉)后面的子串,那么匹配)后跟字符(.*),替换为)

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

或者如果我们要删除从(开始的字符串,匹配0个或多个space(\s*)后跟(和其他字符并替换它与空白 ("")

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

上述正则表达式的更快替代方法是使用 stringi

中的 stri_replace
library(stringi)
stri_replace(str1, regex = "\s*\(.*", "")
#[1] "S156 B1-1 U500"

数据

str1 <- "S156 B1-1 U500 (HTA-1 0).SST RMA gene.sst-rma-gene-full-Signal"