假设我有以下字符串:
s <- "ID=MIMAT0027618;Alias=MIMAT0027618;Name=hsa-miR-6859-5p;Derives_from=MI0022705"
我想恢复和之间的字符串";"
以"="
获得以下输出:
[1] "MIMAT0027618" "MIMAT0027618" "hsa-miR-6859-5p" "MI0022705"
我可以使用strsplit()
多个拆分元素吗?
1)strsplit与矩阵试试这个:
> matrix(strsplit(s, "[;=]")[[1]], 2)[2,]
[1] "MIMAT0027618" "MIMAT0027618" "hsa-miR-6859-5p" "MI0022705"
2) strsplit 与 gsub或这种使用strsplit
with gsub
:
> strsplit(gsub("[^=;]+=", "", s), ";")[[1]]
[1] "MIMAT0027618" "MIMAT0027618" "hsa-miR-6859-5p" "MI0022705"
3) strsplit with sub或 this 使用strsplit
with sub
:
> sub(".*=", "", strsplit(s, ";")[[1]])
[1] "MIMAT0027618" "MIMAT0027618" "hsa-miR-6859-5p" "MI0022705"
4) strapplyc或 this 在等号后提取连续的非分号:
> library(gsubfn)
> strapplyc(s, "=([^;]+)", simplify = unlist)
[1] "MIMAT0027618" "MIMAT0027618" "hsa-miR-6859-5p" "MI0022705"
添加了其他strplit
解决方案。
我知道这是一个老问题,但我发现环顾正则表达式的使用对于这个问题非常优雅:
library(stringr)
your_string <- '/this/file/name.txt'
result <- str_extract(string = your_string, pattern = "(?<=/)[^/]*(?=\\.)")
result
言下之意,
(?<=...)
部分在所需字符串之前...
查找 a (在本例中为正斜杠)。[^/]*
在一行中查找尽可能多的不是正斜杠的字符(在本例中为name.txt
)。(?=...)
查找所需的字符串 a ...
(在本例中为特殊句点字符,需要将其转义为\\.
)。这也适用于数据框:
library(dplyr)
strings <- c('/this/file/name1.txt', 'tis/other/file/name2.csv')
df <- as.data.frame(strings) %>%
mutate(name = str_extract(string = strings, pattern = "(?<=/)[^/]*(?=\\.)"))
# Optional
names <- df %>% pull(name)
或者,在您的情况下:
your_string <- "ID=MIMAT0027618;Alias=MIMAT0027618;Name=hsa-miR-6859-5p;Derives_from=MI0022705"
result <- str_extract(string = your_string, pattern = "(?<=;Alias=)[^;]*(?=;)")
result # Outputs 'MIMAT0027618'