如何匹配具有一个字符公差的字符串?
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
更好,您可能希望降低分数。
我有一个位置向量,我正在尝试消除与正确位置名称向量的歧义。 对于这个例子,我只使用了两个消除歧义的位置:
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
更好,您可能希望降低分数。