如何匹配具有一个字符公差的字符串?

How to match a string with a tolerance of one character?

我有一个位置向量,我正在尝试消除与正确位置名称向量的歧义。 对于这个例子,我只使用了两个消除歧义的位置:

agrepl('Au', c("Austin, TX", "Houston, TX"), 
max.distance =  .000000001, 
ignore.case = T, fixed = T)
[1] TRUE TRUE

帮助页面说 max.distance

Maximum distance allowed for a match. Expressed either as integer, or as a fraction of the pattern length times the maximal transformation cost

我不确定Levensthein距离的数学意义;我的理解是距离越小,对与我的消歧字符串向量不匹配的容忍度越严格。

所以我会 调整它以检索两个 FALSE?基本上,只有当有 1 个字符的差异时,我才想有一个 TRUE,例如:

agrepl('Austn, TX', "Austin, TX", 
max.distance =  .000000001, ignore.case = T, fixed = T)
[1] TRUE

您遇到的问题可能与我在此处开始实验时遇到的问题类似。当 fixed=TRUE 时,第一个参数是正则表达式模式,因此如果不限制为完整字符串,小模式是非常宽松的。帮助页面甚至有关于该问题的 "Note":

Since someone who read the description carelessly even filed a bug report on it, do note that this matches substrings of each element of x (just as grep does) and not whole elements.

使用正则表达式模式,您可以通过在 pattern 字符串两侧添加“^”和“$”来实现此目的,因为与 adist 不同,agrepl 没有部分参数:

> agrepl('^Au$', "Austin, TX", 
+ max.distance =  c(insertions=.15),  ignore.case = T, fixed=FALSE)
[1] FALSE
> agrepl('^Austn, TX$', "Austin, TX", 
+ max.distance =  c(insertions=.15),  ignore.case = T, fixed=FALSE)
[1] TRUE
> agrepl('^Austn, T$', "Austin, TX", 
+ max.distance =  c(insertions=.15),  ignore.case = T, fixed=FALSE)
[1] FALSE

因此您需要将 0 与那些侧卫一起粘贴:

> agrepl( paste0('^', 'Austn, Tx', '$'), "Austin, TX", 
+ max.distance =  c(insertions=.15),  ignore.case = T, fixed=FALSE)
[1] TRUE
> agrepl( paste0('^', 'Au', '$'), "Austin, TX", 
+ max.distance =  c(insertions=.15),  ignore.case = T, fixed=FALSE)
[1] FALSE

使用 all 可能比 insertions 更好,您可能希望降低分数。