【问题标题】:extracting a subset of a string提取字符串的子集
【发布时间】:2017-02-18 14:32:43
【问题描述】:

我的数据框中的列名包含类似于“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 (. 我应该如何删除括号? 谢谢

【问题讨论】:

  • sub('\\(.*','', colnames(data),perl = T) 应该可以。

标签: r string substring gsub


【解决方案1】:

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

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

或者如果我们想删除以(开头的字符串,匹配0个或多个空格(\\s*)后跟(和其他字符并用空格替换(""

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

上述正则表达式的更快替代方法是使用来自stringistri_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"

【讨论】:

    【解决方案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。需要额外的反斜杠,因为反斜杠会转义字符,所以我必须转义转义字符才能说我只是指字符反斜杠。

    【讨论】:

    • 感谢@G5W!工作得很好。你能解释一下 "(.*?)\(.*", "\\1" this 吗?
    猜你喜欢
    • 2021-06-22
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 2021-09-08
    • 2011-07-21
    • 1970-01-01
    相关资源
    最近更新 更多