我需要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
对此的任何帮助将不胜感激:)
答案 0 :(得分:1)
您可以使用sub
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"