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

时间:2018-04-26 23:19:52

标签: r regex pattern-matching

我需要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

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

3 个答案:

答案 0 :(得分:1)

您可以使用sub

获取基本R解决方案
sub(".*\\b(AA\\w*).*", "\\1", mytext1)
[1] "AA12345"
> sub(".*\\b(AA\\w*).*", "\\1", mytext2)
[1] "AA100"

答案 1 :(得分:0)

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

(AA|BB)

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

答案 2 :(得分:0)

我喜欢尽可能将内容保存在base R中,并且已经有解决方案。您真正想要的是regmatches()函数。 See Here

  

从regexpr,gregexpr或regexec获得的匹配数据中提取或替换匹配的子字符串。

要解决您的特定问题

matches = regexpr("(?<=^| )AA.*?(?=$| )", mytext1, perl=T)
regmatches(mytext1, matches)
> [1] "AA12345"

没有匹配项时:

matches = regexpr("(?<=^| )AA.*?(?=$| )", mytext3, perl=T)
regmatches(mytext3, matches)
> character(0)

如果要避免character(0),请将字符串放入向量中并立即运行它们。

alltext = c(mytext1, mytext2, mytext3)
matches = regexpr("(?<=^| )AA.*?(?=$| )", alltext, perl=T)
regmatches(alltext, matches)
> [1] "AA12345" "AA100"

最后,如果您想要单线飞机

regmatches(alltext, regexpr("(?<=^| )AA.*?(?=$| )", alltext, perl=T))
> [1] "AA12345" "AA100"