使用`agrep(...,fixed = F)`的困难

时间:2013-04-08 05:11:34

标签: r

?agrepgrep模糊匹配)中,它提到我可以设置参数fixed=FALSE以将我的模式解释为正则表达式。

然而,我无法让它发挥作用!

agrep('(asdf|fdsa)', 'asdf', fixed=F)
# integer(0)

上面的匹配,因为正则表达式“(asdf | fdsa)”完全匹配测试字符串“asdf”在这种情况下。

确认:

grep('(asdf|fdsa)', 'asdf', fixed=F)
# 1 : it does match with grep

更令人困惑的是,adist正确地将模式和字符串之间的距离设为0,这意味着agrep 肯定 返回1而不是integer(0) (0不可能大于默认max.dist = 0.1)。

adist('(asdf|fdsa)', 'asdf', fixed=F)
#      [,1]
# [1,]    0

为什么这不起作用?有什么我不明白的吗?解决方法? 我很高兴使用adist,但我不完全确定如何将agrep的默认max.distance=0.1参数转换为adist的相应参数。

(是的,我被困在一台不能比R 2.15.2更好的旧电脑上)

> sessionInfo()
R version 2.15.2 (2012-10-26)
Platform: i686-redhat-linux-gnu (32-bit)    
locale:
 [1] LC_CTYPE=en_AU.utf8       LC_NUMERIC=C             
 [3] LC_TIME=en_AU.utf8        LC_COLLATE=en_AU.utf8    
 [5] LC_MONETARY=en_AU.utf8    LC_MESSAGES=en_AU.utf8   
 [7] LC_PAPER=C                LC_NAME=C                
 [9] LC_ADDRESS=C              LC_TELEPHONE=C           
[11] LC_MEASUREMENT=en_AU.utf8 LC_IDENTIFICATION=C      

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base 

2 个答案:

答案 0 :(得分:7)

tl; dr:agrep(..., fixed=F)似乎无法使用“|”字符。使用aregexec

经过进一步调查,我认为这是一个错误,agrep(..., fixed=F) 似乎与'|'一起使用正则表达式(尽管adist(..., fixed=F)确实如此)。

详细说明,请注意

adist('(asdf|fdsa)', 'asdf', fixed=T) # 7
nchar('(asdf|fdsa)')                  # 11

如果'asdf'是{em>非正则表达式字符串'(asdf | fdsa)'agrep',则距离为7。

关于那个说明:

agrep('(asdf|fdsa)', 'asdf', fixed=F, max.distance=7) # 1
agrep('(asdf|fdsa)', 'asdf', fixed=F, max.distance=6) # integer(0)

如果fixed=T,这些是我期望的结果。如果fixed=F,我的正则表达式将匹配'asdf'正好并且距离将为0,所以我总是会从agrep中得到'1'的结果。

所以它看起来 agrep(pattern, x, fixed=F)不起作用,即它实际上将fixed重新判断为这种模式为真。

正如@Arun提到的,它可能只是'|'不起作用的正则表达式。例如,agrep('la[sb]y', 'lazy', fixed=FALSE) 按预期工作。


编辑:解决方法(感谢@Arun)

功能aregexec似乎有效。

> aregexec('(asdf|fdsa)', 'asdf', fixed=F)
[[1]]
[1] 1 1
attr(,"match.length")
[1] 4 4

答案 1 :(得分:1)

(最终)这已在R源“ trunk” /“ R-devel”中得到修复)和R-patched,它们将在2018年7月上旬成为R 3.5.1。