考虑这个简单的例子
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。有什么想法吗?
谢谢!
答案 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
函数中的代码,我将它们分开以获得更好的可见性。