【问题标题】:Fuzzy, but not too fuzzy string matching with agrep模糊,但不是太模糊的字符串匹配 agrep
【发布时间】:2014-10-07 13:40:21
【问题描述】:

我有一个这样的字符串:

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 个字符的字符串?

【问题讨论】:

  • 优秀的stringdist 包可能是一个不错的选择,具有更多控制权。
  • 这正是我想要的,谢谢!

标签: regex r


【解决方案1】:

agrep 替换为adist 的替代方法:

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

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

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

【讨论】:

  • 谢谢我把它和@Tyler Rinker推荐的stringdist包结合起来
【解决方案2】:

您可以使用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"

【讨论】:

    猜你喜欢
    • 2018-05-31
    • 2012-02-14
    • 2014-11-02
    • 2021-04-19
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    相关资源
    最近更新 更多