9

?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 而不是(不可能 0 大于 default )。integer(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 
4

2 回答 2

7

tl;博士:agrep(..., fixed=F)似乎不适用于“|” 特点。使用aregexec.

经过进一步调查,我认为这是一个错误,并且似乎agrep(..., fixed=F)不适用于 '|' 正则表达式(虽然有)。adist(..., fixed=F)

详细说明,请注意

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

如果'asdf'被agrep'd'到非正则表达式字符串'(asdf | fdsa)',那么它的距离为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

所以它看起来agrep(pattern, x, fixed=F)不起作用,即它实际上fixed认为这种模式为 TRUE。

正如@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
于 2013-04-08T05:47:34.427 回答
1

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

于 2018-06-20T06:02:52.183 回答