在字符串句子中提取关键字的最优雅方式是什么?
我有一个CSV关键字列表,我想预测与字符串中存在的关键字完全匹配。
sapply(keywords, regexpr, String, ignore.case=FALSE)
我使用了上面的代码,但它也给出了近似匹配。
答案 0 :(得分:0)
问题是正则表达式不知道'单词'是什么 - 它们寻找模式。请考虑以下关键字和字符串。
keywords = c("bad","good","sad","mad")
string = "Some good people live in the badlands which is maddeningly close to the sad harbor."
这里“坏”匹配“荒地”,因为前三个字符中出现了“坏”的模式。与“疯狂”和“疯狂”相同。
sapply(keywords, regexpr, string, ignore.case=FALSE)
#> bad good sad mad
#> 30 6 73 48
因此,我们需要修改模式以使其检测到我们真正想要的内容。问题是知道我们真正想要的是什么。如果我们想要一个不同的单词,那么我们可以在关键字周围添加边界。正如安德烈在评论中指出的那样,正则表达式中的\b
是word boundary。
sapply(paste("\\b",keywords,"\\b",sep=""), regexpr, string, ignore.case=FALSE)
#> \\bbad\\b \\bgood\\b \\bsad\\b \\bmad\\b
#> -1 6 73 -1
注意,我所做的是使用paste
函数在每个关键字之前和之后粘贴转义\b
。这将返回'bad'和'mad'的不匹配代码,但会找到'good'和'sad'的整个单词版本。
如果要查找带连字符的字符,则需要修改表达式的边界匹配部分。