9

?agrep( with fuzzy matching)では、パターンを正規表現として解釈できるようgrepに引数を設定できると述べています。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 として正しく指定します。これは、(0 がデフォルトよりも大きい可能性はありません)ではなく、確実に 1 を返すagrep必要があることを意味します。integer(0)max.dist = 0.1

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

なぜこれが機能しないのですか?わからないことがありますか?回避策はありますか? を使用してよかったのですが、のデフォルトパラメータをの対応するパラメータadistに変換する方法が完全にはわかりません。agrepmax.distance=0.1adist

(はい、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;dr: agrep(..., fixed=F)'|' では動作しないようです キャラクター。を使用しaregexecます。

さらに調査したところ、これはバグであると思われ、'|' では機能しないagrep(..., fixed=F)ようです。正規表現(ただし)。adist(..., fixed=F)

詳しく説明すると、

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

「asdf」がagrep正規表現文字列「(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 になるため、常に '1' の結果が返されagrepます。

つまり、実際にはこの種のパターンに対して TRUE と見なされます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
于 2013-04-08T05:47:34.427 に答える