美文网首页Science相关 杂
正则表达式是我们认识世界的哲学--转自果子学生信

正则表达式是我们认识世界的哲学--转自果子学生信

作者: 天涯清水 | 来源:发表于2020-01-22 23:33 被阅读0次

    正则表达式是我们认识世界的哲学

    原创 果子学生信 正则表达式是我们认识世界的哲学

    首先我回答了一个学员的提问,
    有些GEO平台的探针转换比较麻烦
    然后我为了使代码更加简洁,问了洲更一个问题,

    如何获取括号中的内容,但不要返回括号。

    我为什么这么问,因为我知道perl语言里面的正则表达式是可以实现这个功能的,而我曾经学过两个星期的perl语言。

    这是他的回答,大概时间就是1个小时之内,包括了写帖子的过程。所以江湖人称“日更小王子”,更新速度极快。
    【答果子问】R语言如何用正则表达式提取特定的字符串

    看了回答,深刻的理解了这句话,

    正则表达式是我们认识世界的哲学

    决定把代码再精简一点。

    观察之后总结模式

    string = "Homo sapiens intraflagellar transport 80 homolog (Chlamydomonas) (IFT80), mRNA"

    以这个为例,他里面有两个括号,我们要观察他,然后再把它抽象模式化。

    • 我们必须到找到一对括号,而且这个括号需要在逗号之前。

    • 因为括号是元字符,需要斜杠来转译,而斜杠也是元字符,需要另外一个斜杠来转译。
      现在这个模式可以写成这个样子

    pattern = "\\(\\),"
    

    那么找到了括号,这个括号里面是要有东西的,内容就是大小写字母和数字的结合[A-Za-z0-9],而且数量不限,所以,这个模式就变成了这样,* 符号代表是0或者多个

    pattern = "\\([A-Za-z0-9]*\\),"
    

    其中,我们想要把括号中的内容[A-Za-z0-9]*单独提取出来,那么需要给他增加一对括号,我们的模式就定型了

    pattern = "\\(([A-Za-z0-9]*)\\),"
    

    测试结果

    现在可以测试一下stringr包中的str_view函数可以可视化匹配的结果

    str_view(string,pattern)
    
    image

    使用str_match函数来匹配

    str_match(string,pattern)
    
    image

    我们需要的括号内的内容在第二列,如果str_match中没有额外的括号,结果只会是一列

    str_match(string,pattern)[,2]
    

    [1] "IFT80"

    既然我们明确地定义了做一件事情的步骤,那么我们就可以批量做。

    library(dplyr)library(stringr)probeGenesymbol <- GPL4381 %>%   # 增加一个新的列gene_symbol,这个列获取了括号中的内容  mutate(gene_symbol = str_match(.$GB_DEFINITION,pattern)[,2]) %>%  # 过滤掉gene_symbol为空的行  filter(gene_symbol != "") %>%   # 选出需要的列  select(ID,gene_symbol,GB_DEFINITION)
    

    现在这个代码足够简洁,更重要的是,我们升级了匹配模式,正则表达式就像眼睛一样,戴不戴世界就在那里,不增不减,但是戴上后,细节更多了,此时我们获得了跟多的结果,总共11399行。

    image

    既然开始接触字符串的处理以及正则表达式,我会系统地学习一下R语言的爬虫,把这两者更好地结合起来。

    相关文章

      网友评论

        本文标题:正则表达式是我们认识世界的哲学--转自果子学生信

        本文链接:https://www.haomeiwen.com/subject/imjbzctx.html