模糊但不太模糊的字符串与agrep匹配

时间:2014-10-07 13:40:21

标签: regex r

我有一个这样的字符串:

text <- c("Car", "Ca-R", "My Car", "I drive cars", "Chars", "CanCan")

我想匹配一个模式,所以它只匹配一次,最大匹配。一个替换/插入。结果应如下所示:

> "Car"

我尝试了以下内容,仅使用max匹配我的模式一次。替换/插入等并获得以下内容:

> agrep("ca?", text, ignore.case = T, max = list(substitutions = 1, insertions = 1, deletions = 1, all = 1), value = T)
[1] "Car"          "Ca-R"         "My Car"       "I drive cars" "CanCan"  

有没有办法排除比我的模式长n个字符的字符串?

2 个答案:

答案 0 :(得分:1)

agrep替换为adist的替代方案:

text[which(adist("ca?", text, ignore.case=TRUE) <= 1)]

adist给出了将一个字符串转换为另一个字符串所需的插入/删除/替换次数,因此,只保留adist等于或小于1的元素应该可以满足您的需求。 / p>

如果你真的想要排除“n个字符更长的时间”这个答案可能不太合适。比模式(n是可变的),而不是只匹配整个单词(在你的例子中n总是1)。

答案 1 :(得分:0)

您可以使用nchar根据字符串长度限制字符串:

pattern <- "ca?"
matches <- agrep(pattern, text, ignore.case = T, max = list(substitutions = 1, insertions = 1, deletions = 1, all = 1), value = T)
n <- 4
matches[nchar(matches) < n+nchar(pattern)]
# [1] "Car"    "Ca-R"   "My Car" "CanCan"