提取两个字符R之间的字符[重复]

Posted

技术标签:

【中文标题】提取两个字符R之间的字符[重复]【英文标题】:Extract characters between two characters R [duplicate] 【发布时间】:2020-01-29 06:32:57 【问题描述】:

我有一个 df,我想提取 './' 和 '.v8' 之间的组织名称 所以对于这个df,结果将是一个只有“甲状腺”、“食道肌肉”、“脂肪”的列

gene<-c("ENSG00000065485.19","ENSG00000079112.9","ENSG00000079112")
tissue<-c("./Thyroid.v8.signif_variant_gene_pairs.txt.gz","./Esophagus_Muscularis.v8.signif_variant_gene_pairs.txt.gz","./Adipose_Subcutaneous.v8.signif_variant_gene_pairs.txt.gz")
df<-data.frame(gene,tissue)

我真的很纠结于正则表达式并尝试过:

pattern="/.\(.*)/.v8(.*)"
result <- regmatches(df$tissue,regexec(pattern,df$tissue))

但我明白了:

错误:'(' 是字符串开头的无法识别的转义 ""/.("

【问题讨论】:

qdapRegex::ex_between(df$tissue, "/", ".v8") 我如何使它成为一列字符串而不是列表?? unlist他们,unlist(qdapRegex::ex_between(df$tissue, "/", ".v8")) 【参考方案1】:

R,我们需要转义(\)。在这里,我们使用了匹配单词 (\\w+) 的正则表达式查找,该单词在 .(元字符 - 转义)和 \ 之后,然后是 .\\ 转义)和 'v8'

library(stringr)
library(dplyr)
df %>% 
    mutate(new = str_extract(tissue, "(?<=\\.[/])\\w+(?=\\.v8)"))
#             gene                                                     tissue                  new
#1 ENSG00000065485.19              ./Thyroid.v8.signif_variant_gene_pairs.txt.gz              Thyroid
#2  ENSG00000079112.9 ./Esophagus_Muscularis.v8.signif_variant_gene_pairs.txt.gz Esophagus_Muscularis
#3    ENSG00000079112 ./Adipose_Subcutaneous.v8.signif_variant_gene_pairs.txt.gz Adipose_Subcutaneous

(?&lt;=\\.[/]) - 是正向向后查找,以匹配 . 和单词前面的 / (\\w+),以及 (?=\\.v8) - 正向向后查找以匹配 . 和字符串 'v8 '在这个词之后。因此,基本上,它会查找前后有模式的单词并提取该单词

【讨论】:

哇!那行得通-谢谢。你能解释一下正则表达式吗?我理解'\\。'正在转义特殊字符“。”我认为 \\w+ 是任何单词或字符,但不知道其余的? @zoe 谢谢。我更新了一些描述 嗨@akrun,抱歉,但我有一些行在字符串中有一个'-',例如'./Cells_EBV-transformed_lymphocytes.v8.signif_varianiant_gene_pairs.txt.gz',我认为这会导致'不”。有没有办法也抓住'-'?? @zoe 那会不会使欺骗链接不是欺骗?

以上是关于提取两个字符R之间的字符[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在两个分隔符之间提取字符串[重复]

在R中提取以标点符号开头和结尾的文本[重复]

Groovy - 在两个不同的字符串之间提取字符串[重复]

python regex提取字符之间的字符串[重复]

在其他两个保守字符串之间提取字符串并允许 python 或 R 中的不匹配

R:如何在 R 中的两个重复项之间包含一个字符?