【问题标题】:Regular expression to separate string containing upper and lower case用于分隔包含大小写的字符串的正则表达式
【发布时间】:2019-02-24 20:25:05
【问题描述】:

我无法使正则表达式任务正常工作,如果有人可以提供帮助,那就太好了。 我需要将基因名称与附加到它们的描述分开。使用出现在 99% 的案例中的术语涉及将其与“GeneCards 摘要”分开,可通过gene <- str_split (DF$Gene, "GeneCards Summary", simplify = TRUE) 使用 tidyverse 解决。但是现在有一些不遵循这种模式,这里举例说明:

example <- c("STAT1Predisposition to Mucocutaneous Candidiasis", 
             "PMS2DNA Repair DefectsPMS2 Deficiency", 
             "FANCACombined ImmunodeficiencyFANCA", 
             "HAX1 This gene", "ELANE ELANE is a gene", 
             "IL1RNNon-Inflammasome Related", "PRKDCT-B- SCIDDNA PKcs",
             "MSH6Severe Reduction", "AP3B1FHL Syndromes")

我能够找出以下模式,希望这涵盖了所有模式(不太可能,但使用你的解决方案,如果它们弹出,我也应该得到其余的):

1) Genename 后跟一个包含 UPPERCASElowerlase 的单词(因此将此部分与之前的部分分开)。
2) GenenameDNA(将“DNA”与之前的部分分开。
3) 基因名"" (空白)
4) 基因名称T-B-.
5) 基因名FHL。

实际上最棘手的是 UPPERCASe 小写部分,其他部分我将尝试解决并在此处发布。
非常感谢你的帮助! 塞巴斯蒂安

这是我的解决方案的一部分,没有上/下一个:

clean_1 <- str_split(example, "DNA", simplify = T)
clean_2 <- str_split(clean_1, "[[:blank:]]", simplify = T)
clean_3 <- str_split(clean_2, "T-B", simplify = T)
clean_4 <- str_split(clean_3, "FHL", simplify = T)

我会在每一轮都这样做以清理数据,但可能有更好的方法来做到这一点。

【问题讨论】:

  • UPPERCASElowerlase 到底是什么意思?描述并非总是以一个大写后跟小写开头(例如 PMS2DNA Repair DefectsPMS2 Deficiency,我假设您想在 PMS2 和 DNA 之间拆分......)。我真的不知道如何让正则表达式区分哪些大写字母来自基因,哪些来自描述。
  • 您没有明确的模式来隔离每种情况下的基因名称。你是如何得到这些数据的?通过文本识别?从其他来源提取?为什么基因名称没有用空格或其他任何东西分隔?如果可能,最好改变获取数据的方式,然后尝试更正它。
  • 我从测序设备提供的 html 文件中获取数据。不幸的是,没有办法更好地隔离它们,所以我需要采取这种措施来找出违规行为,然后再将它们剔除。不太干净,但我想现实很少是......

标签: r regex strsplit


【解决方案1】:

假设您的示例代表了所有可能性,那么您拥有的是:

  • 基因名称总是在字符串的开头
  • 总是大写,有时带有数字(可能是标点符号?)
  • 有些情况下,基因名称与下一句合并,总是以大写开头,后跟小写。

所以一个解决方案是:提取每个字符串中的第一个单词,然后识别附加单词的情况(一个大写,然后是小写)并删除它们。继续使用包 stringr:

library(stringr)

# Extract any characters before the first space:
fWord <- str_extract(example, '([^[:blank:]]+)')

# Find the index of strings that have lower cases:
ind <- grep('[:lower:]', fWord)

# Select everything until the first lower caseand remove the last character:
fWord[ind] <- str_sub(str_extract(fWord[ind], '([^[:lower:]]+)' ), end = -2)

> fWord
[1] "STAT1"     "PMS2DNA"   "FANCA"     "HAX1"      "ELANE"     "IL1RN"    
[7] "PRKDCT-B-" "MSH6"      "AP3B1FHL" 

我很确定这可以在一行中完成。试着让你的问题更清楚,也许有人会提出一些花哨的正则表达式来完成工作。

【讨论】:

  • 非常感谢卡洛斯,但还没有完成;有了这个,我得到最后一个大写字母仍然附加到基因名称(例如,IL1RNN 而不是 IL1RN 或 STAT1P 而不是 STAT1)。如何更改代码以便 UPPER 和 SMALL 都出院?
  • 这是我在答案中评论的,Martijn已经在cmets中发过:如何区分属于哪个基因名称的大写字母属于下一个单词?
  • 好的,现在我明白你要做什么了。我会编辑答案。即使您接受新的解决方案,我强烈建议您编辑您的问题以使其更清楚。
  • 我可能错了,但是 POSIX 字符类必须用括号括起来,例如:grep('[[:lower:]]', fWord),否则它将匹配文字字符:low , e, r
猜你喜欢
  • 2013-08-05
  • 2017-01-18
  • 2021-04-18
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多