r - 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
对此的任何帮助将不胜感激:)
解决方案
这是一种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 日创建。
推荐阅读
- sql - 为什么 Firebird 中最后插入的行没有显示在表格末尾
- java - 如何使用 Java 在输出中保留空格?
- power-automate - Power Automate 创建自定义存储桶 ID 并在其中创建任务
- java - 覆盖 PNG 时的奇怪行为
- hadoop - 是什么导致 Hadoop 服务器(以及一般情况下)中的数据表“损坏”?
- python - ValueError: low >= high in np.random.randint [新类型]
- bash - 用 `jQuery` 用 bash 替换所有 $ 符号
- python - 在外壳中显示一个条形以直观地指示不断变化的计数
- javascript - 我如何删除不是我的消息,而是将机器人发送给我的消息?
- scala - 将 Scala Seq 转换为 Spark DStream?