首页 文章

R使用模式匹配从字符串中提取单词

提问于
浏览
0

在R中我需要一些关于模式匹配的帮助 . 我需要从一个长字符串中提取一个以公共前缀开头的整个单词 . 我想要提取的单词始终以相同的前缀(AA)开头,但单词的长度不同,并且不会出现在字符串的相同位置 .

mytext1 <- as.character("HORSE MONKEY LIZARD AA12345 SWORDFISH") # Return AA12345

mytext2 <- as.character("ELEPHANT AA100 KOALA POLAR.BEAR") # Want to return AA100

mytext3 <- as.character("CROCODILE DRAGON.FLY ANTELOPE") # Want to return NA

作为这个的扩展,如果有两个不同的模式匹配,我想要返回两个字符串怎么办?

mytext4 <- as.character("TULIP AA999 DAISY BB123") 
# Pattern matching to AA and BB 
# Want to return AA999 BB123

任何有关这方面的帮助将非常感谢:)

2 回答

  • 1

    这是一种 stringr 方法 . 正则表达式匹配 AA 前面有空格或字符串 (?<=^| ) 的开头,然后匹配尽可能少的字符 .*? 直到下一个空格或字符串 (?=$| ) 的结尾 . 请注意,您可以将所有字符串组合到一个向量中,并返回一个向量 . 如果你想要每个字符串的所有匹配项,那么使用 str_extract_all 而不是 str_extract ,你会得到一个包含每个字符串向量的列表 . 如果要指定多个匹配项,请使用选项和捕获组 (AA|BB) ,如图所示 .

    mytext <- c(
      as.character("HORSE MONKEY LIZARD AA12345 SWORDFISH"), # Return AA12345
      as.character("ELEPHANT AA100 KOALA POLAR.BEAR"), # Want to return AA100,
      as.character("AA3273 ELEPHANT KOALA POLAR.BEAR"), # Want to return AA3273
      as.character("ELEPHANT KOALA POLAR.BEAR AA5785"), # Want to return AA5785
      as.character("ELEPHANT KOALA POLAR.BEAR"), # Want to return nothing
      as.character("ELEPHANT AA12345 KOALA POLAR.BEAR AA5785") # Can return only AA12345 or both
    )
    
    library(stringr)
    mytext %>% str_extract("(?<=^| )AA.*?(?=$| )")
    #> [1] "AA12345" "AA100"   "AA3273"  "AA5785"  NA        "AA12345"
    mytext %>% str_extract_all("(?<=^| )AA.*?(?=$| )")
    #> [[1]]
    #> [1] "AA12345"
    #> 
    #> [[2]]
    #> [1] "AA100"
    #> 
    #> [[3]]
    #> [1] "AA3273"
    #> 
    #> [[4]]
    #> [1] "AA5785"
    #> 
    #> [[5]]
    #> character(0)
    #> 
    #> [[6]]
    #> [1] "AA12345" "AA5785"
    
    as.character("TULIP AA999 DAISY BB123") %>% str_extract_all("(?<=^| )(AA|BB).*?(?=$| )")
    #> [[1]]
    #> [1] "AA999" "BB123"
    

    reprex package(v0.2.0)于2018-04-29创建 .

  • 0

    您可以使用 sub 获得基本R解决方案

    sub(".*\\b(AA\\w*).*", "\\1", mytext1)
    [1] "AA12345"
    > sub(".*\\b(AA\\w*).*", "\\1", mytext2)
    [1] "AA100"
    

相关问题