gregexpr
を使用して、さまざまな長さの重複する一致をすべて抽出する方法です。
トリックは、キャプチャグループ内のパターンを囲み、キャプチャグループを先読みアサーションで囲みます。 gregexpr
は、属性がcapture.length
の開始位置を含むリストを返します。最初の列は最初の取得グループの一致長です。これをベクトルに変換してmatch.length
属性に移動すると(パターン全体が先読みアサーションの内部にあるため、すべて0になります)、文字列を抽出するにはregmatches
に渡すことができます。
x
が文字列のリストである場合、最終結果のタイプによって暗示されるように、いくつかの変更を加えて、ベクトル化することができます。
x<-list(s1="abaaaababaaa", s2="ab")
matches<-gregexpr('(?=((ab)|b))', x, perl=TRUE)
# make a function that replaces match.length attr with capture.length
set.match.length<-
function(x) structure(x, match.length=as.vector(attr(x, 'capture.length')[,1]))
# set match.length to capture.length for each match object
matches<-lapply(matches, set.match.length)
# extract substrings
mapply(regmatches, x, lapply(matches, list))
# $s1
# [1] "ab" "b" "ab" "b" "ab" "b"
#
# $s2
# [1] "ab" "b"
これはあまりにも(アップ投票された)仕事ですが、私は明示的なループを避けたい、私の文字列はかなり長いです。 –
@AdityaSihag、それは間違いなく最適化することができた、私はちょうどそこにこのソリューションを投げたいと思った。 –