簡體   English   中英

使用agrep進行模糊但不太模糊的字符串匹配

[英]Fuzzy, but not too fuzzy string matching with agrep

我有一個像這樣的字符串:

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

替代它取代agrepadist

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

adist給出了將一個字符串轉換為另一個字符串所需的插入/刪除/替換的數量,因此,我認為僅保留adist等於或小於adist的元素應該可以為您提供所需的內容。

如果您確實想排除比模式(n為變量)“ n個字符更長”的東西,而不是僅僅匹配整個單詞(在示例中n始終為1),則此答案可能不太合適。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM