首页 > 解决方案 > R使用模式匹配从字符串中提取单词

问题描述

我需要一些关于 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

对此的任何帮助将不胜感激:)

标签: rregexpattern-matching

解决方案


这是一种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 包(v0.2.0)于 2018 年 4 月 29 日创建。


推荐阅读