在R中匹配数据框目标列名的正则表达式求解
正则表达式修正:匹配指定列名并排除特定模式
需求概述
需要在R语言中用正则表达式从数据框列名里匹配包含Epithelium的字符串,同时排除包含Stroma的字符串。
待匹配字符串示例
tumor_stroma_epi_ovr_v4..Epithelium.area.µm.2 tumor_stroma_epi_colo_v3..Epithelium.area...m.2 tumor_stroma_epi_nsclc_v2..Epithelium.area.µm.2 tumor_stroma_epi_tnbc_v3..Epithelium.area.µm.2 tumor_stroma_epi_panc_v5..Epithelium.area.µm.2
需排除字符串示例
tumor_stroma_epi_ovr_v4..Stroma.area.µm.2 tumor_stroma_epi_colo_v3..Stroma.area...m.2 tumor_stroma_epi_nsclc_v2..Stroma.area.µm.2 tumor_stroma_epi_tnbc_v3..Stroma.area.µm.2 tumor_stroma_epi_panc_v5..Stroma.area.µm.2
原正则的问题分析
原正则^tumor_stroma_epi_[a-z]+_v[0-9]+\\.{2}Epithelium\\.area\\.?µm\\.2$存在以下限制:
- 仅允许
area后有0或1个点,无法匹配...m这种多个点的情况 - 硬编码
µm,无法覆盖µm或纯m的单位形式 - 结尾匹配过于严格,没有兼容不同单位的变化
修正后的正则表达式
下面的正则可以覆盖所有待匹配场景,同时自动排除包含Stroma的字符串:
pattern <- "^tumor_stroma_epi_[a-z]+_v[0-9]+\\.{2}Epithelium\\.area.*(Â?µ|m)\\.2$"
正则说明
^tumor_stroma_epi_[a-z]+_v[0-9]+\\.{2}:匹配统一的前缀部分,确保开头符合指定格式Epithelium\\.area:明确匹配包含Epithelium的关键段,自然排除Stroma的字符串.*:匹配area到单位之间的任意字符(包括多个点、特殊字符等)(Â?µ|m):匹配三种单位情况:µ、µ、m\\.2$:匹配结尾的.2,确保字符串结构完整
测试代码及结果
strings <- c( "tumor_stroma_epi_ovr_v4..Epithelium.area.µm.2", "tumor_stroma_epi_colo_v3..Epithelium.area...m.2", "tumor_stroma_epi_nsclc_v2..Epithelium.area.µm.2", "tumor_stroma_epi_tnbc_v3..Epithelium.area.µm.2", "tumor_stroma_epi_panc_v5..Epithelium.area.µm.2", "tumor_stroma_epi_ovr_v4..Stroma.area.µm.2", "tumor_stroma_epi_colo_v3..Stroma.area...m.2", "tumor_stroma_epi_nsclc_v2..Stroma.area.µm.2", "tumor_stroma_epi_tnbc_v3..Stroma.area.µm.2", "tumor_stroma_epi_panc_v5..Stroma.area.µm.2" ) pattern <- "^tumor_stroma_epi_[a-z]+_v[0-9]+\\.{2}Epithelium\\.area.*(Â?µ|m)\\.2$" matches <- grepl(pattern, strings) print(matches)
执行后输出:
[1] TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE
内容的提问来源于stack exchange,提问作者fgootkind
相关产品推荐
相关产品推荐

