stringr:提取包含特定单词的单词

时间:2017-07-18 13:06:04

标签: r regex stringr

考虑这个简单的例子

dataframe <- data_frame(text = c('WAFF;WOFF;WIFF200;WIFF12',
                                 'WUFF;WEFF;WIFF2;BIGWIFF'))

> dataframe
# A tibble: 2 x 1
                      text
                     <chr>
1 WAFF;WOFF;WIFF200;WIFF12
2  WUFF;WEFF;WIFF2;BIGWIFF

在这里,我想提取包含WIFF的字词,我希望最终得到像这样的数据框

> output
# A tibble: 2 x 1
            text
           <chr>
1 WIFF200;WIFF12
2  WIFF2;BIGWIFF

我尝试使用

dataframe %>% 
  mutate( mystring = str_extract(text, regex('\bwiff\b', ignore_case=TRUE)))

但这只能回复NAs。有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

通过基础R的经典非正则表达方法将是,

sapply(strsplit(me$text, ';', fixed = TRUE), function(i) 
                              paste(grep('WIFF', i, value = TRUE, fixed = TRUE), collapse = ';'))

#[1] "WIFF200;WIFF12" "WIFF2;BIGWIFF" 

答案 1 :(得分:2)

您似乎想要删除包含WIFF的所有字词和删除;的字词(如果有的话)。使用

> dataframedataframe <- data.frame(text = c('WAFF;WOFF;WIFF200;WIFF12', 'WUFF;WEFF;WIFF2;BIGWIFF'))
> dataframe$text <- str_replace_all(dataframe$text, "(?i)\\b(?!\\w*WIFF)\\w+;?", "")
> dataframe
            text
1 WIFF200;WIFF12
2  WIFF2;BIGWIFF

模式(?i)\\b(?!\\w*WIFF)\\w+;?匹配:

  • (?i) - 不区分大小写的内联修饰符
  • \\b - 字边界
  • (?!\\w*WIFF) - 否定向前搜索失败,其中任何一个单词在其中包含WIFF的任何匹配
  • \\w+ - 一个或多个单词字符
  • ;? - 可选的;?匹配其修改的模式的1或0次出现)

如果由于某种原因您想使用str_extract,请注意您的正则表达式无法正常工作,因为\bWIFF\b matches a whole word WIFF而没有其他内容。您的DF中没有这样的单词。您可以使用"(?i)\\b\\w*WIFF\\w*\\b"来匹配内部WIFF的任何字词(不区分大小写)并使用str_extract_all来获取多次出现,并且不要忘记将匹配加入单个&#34;字符串&#34;:

> df <- data.frame(text = c('WAFF;WOFF;WIFF200;WIFF12', 'WUFF;WEFF;WIFF2;BIGWIFF'))
> res <- str_extract_all(df$text, "(?i)\\b\\w*WIFF\\w*\\b")
> res
[[1]]
[1] "WIFF200" "WIFF12" 

[[2]]
[1] "WIFF2"   "BIGWIFF"

> df$text <- sapply(res, function(s) paste(s, collapse=';'))
> df
            text
1 WIFF200;WIFF12
2  WIFF2;BIGWIFF

你可以&#34;缩小&#34;通过将str_extract_all放入sapply函数中的代码,我将它们分开以获得更好的可见性。