提取字符串的子集
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"
我的数据框中的列名称包含类似于 "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"