删除部分字符串

Lis*_*ann 79 regex string r

如何删除部分字符串?例如,ATGAS_1121我想删除之前的所有内容_.

Jos*_*ich 116

使用正则表达式.在这种情况下,您可以使用gsub:

gsub("^.*?_","_","ATGAS_1121")
[1] "_1121"
Run Code Online (Sandbox Code Playgroud)

此正则表达式匹配字符串的开头(^),重复零次或多次(*)和下划线(_)的任何字符(.).的?使匹配"懒惰",以便它只匹配第一个下划线.该匹配仅替换为下划线.有关?regex详细信息和参考,请参阅

  • 在例如`gsub("^.*_","_","ATGAS_1121_xxx")`的情况下,先前的正则表达式将匹配最后一个下划线.现在修好了. (6认同)
  • @Joshua我发现解释正则表达式的作用非常有用. (4认同)

dou*_*oug 33

你可以使用内置的这个,strsplit:

> s = "TGAS_1121"
> s1 = unlist(strsplit(s, split='_', fixed=TRUE))[2]
> s1    
 [1] "1121"
Run Code Online (Sandbox Code Playgroud)

strsplitsplit参数上解析的两个字符串作为列表返回.这可能不是你想要的,所以将调用包装在unlist中,然后索引该数组,以便只返回向量中两个元素中的第二个.

最后,fixed参数应设置为TRUE以指示split参数不是正则表达式,而是文字匹配字符.


ver*_*our 20

strsplit如果s是向量,这是解决方案:

> s <- c("TGAS_1121", "MGAS_1432")
> s1 <- sapply(strsplit(s, split='_', fixed=TRUE), function(x) (x[2]))
> s1
[1] "1121" "1432"
Run Code Online (Sandbox Code Playgroud)

  • 非常有帮助,谢谢!FYI获取字符串的第一部分(即在'_'之前),用[1]替换最后的[2]. (2认同)

nau*_*101 19

如果你是Tidyverse的人,这里是stringr解决方案:

R> library(stringr)
R> strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121") 
R> strings %>% str_replace(".*_", "_")
[1] "_1121" "_1432" "_1121"
# Or:
R> strings %>% str_replace("^[A-Z]*", "")
[1] "_1121" "_1432" "_1121"
Run Code Online (Sandbox Code Playgroud)


Agi*_*ean 7

也许最直观的解决方案可能是使用比该函数更简单的stringr函数,因为它只有 1 个参数而不是 2 个参数。str_removestr_replace

示例中唯一棘手的部分是您想要保留下划线,但它是可能的:您必须匹配正则表达式,直到找到指定的字符串模式(?=pattern)

参见示例:

strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121")
strings %>% stringr::str_remove(".+?(?=_)")

[1] "_1121" "_1432" "_1121"
Run Code Online (Sandbox Code Playgroud)