删除字符串的一部分


90

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

Answers:


131

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

gsub("^.*?_","_","ATGAS_1121")
[1] "_1121"

此正则表达式匹配字符串(^)的开头,重复零次或多次(*)的任何字符(。)和下划线(_)。?使匹配项“惰性”,以便仅匹配项与第一个下划线相距较远。该匹配项仅由下划线代替。请参阅?regex以获取更多详细信息和参考


6
在例如的情况下,前一个正则表达式将匹配最后一个下划线gsub("^.*_","_","ATGAS_1121_xxx")。现在已修复。
Richie Cotton

7
@Joshua我发现解释正则表达式的作用非常有用。
Vasile 2015年

这也适用于字符串向量作为最后一个参数。R真棒。
naught101 '17

37

您可以为此使用内置的strsplit

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

strsplit返回在split参数上解析的两个字符串作为列表。那可能不是您想要的,因此将调用包装在unlist中,然后对该数组进行索引,以便仅返回向量中两个元素的第二个。

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


23

如果您是Tidyverse类的人,这是更严格的解决方案:

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"

21

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

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

2
非常有帮助,谢谢!仅供参考,以获取字符串的第一部分(即“ _”之前),将末尾的[2]替换为[1]。
stevenjoe

4

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

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

参见示例:

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

[1] "_1121" "_1432" "_1121"

3

这是strsplit使用dplyr包的数据框的解决方案

col1 = c("TGAS_1121", "MGAS_1432", "ATGAS_1121") 
col2 = c("T", "M", "A") 
df = data.frame(col1, col2)
df
        col1 col2
1  TGAS_1121    T
2  MGAS_1432    M
3 ATGAS_1121    A

df<-mutate(df,col1=as.character(col1))
df2<-mutate(df,col1=sapply(strsplit(df$col1, split='_', fixed=TRUE),function(x) (x[2])))
df2

  col1 col2
1 1121    T
2 1432    M
3 1121    A
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.