word:12335
anotherword:2323434
totallydifferentword/455
word/32
:
または/
ベースR関数のみを使用する前に文字列を取得する必要があります。私はこれを使用してこれを行うことができますstringr
が、パッケージに別の依存関係を追加したくありません。単語の文字数は可変ですが、常に区切り文字(の1つ)で終わります。後に続くものを保持する必要はありません。
多分試してみてください:
x <- c("word:12335", "anotherword:2323434", "totallydifferentword/455", "word/32")
lapply(strsplit(x, ":|/"), function(z) z[[1]]) #as a list
sapply(strsplit(x, ":|/"), function(z) z[[1]]) #as a string
それでも機能する正規表現ソリューションがありますgsub
が、同様の問題の私の経験では、strsplit
雄弁ではありませんが、より速くなります。
この正規表現も機能すると思います。
gsub("([a-z]+)([/|:])([0-9]+)", "\\1", x)
この場合、gsubの方が高速でした。
Unit: microseconds
expr min lq median uq max
1 GSUB() 19.127 21.460 22.392 23.792 106.362
2 STRSPLIT() 46.650 50.849 53.182 54.581 854.162
このようなものは、 Rubyhttp://rubular.com/r/PzVQVIpKPqでトリックを実行します
^(\w+)(?:[:\/])
文字列の先頭から始めて、任意の単語文字を取得し、キャプチャされていない文字またはキャプチャされていない文字に到達するまでキャプチャします/
。:
この正規表現は機能しているようです。Rで使えますか?
パッケージunglueを使用できます:
library(unglue)
x <- c("word:12335", "anotherword:2323434", "totallydifferentword/455", "word/32")
unglue_vec(x, "{res}{=[:/].*?}")
#> [1] "word" "anotherword" "totallydifferentword"
#> [4] "word"
reprexパッケージ(v0.3.0)によって2019-10-08に作成されました
{res}
何にでも一致し、返されます、それはと同等です{res=.*?}
{=[:/].*?}
:
またはで始まるものに一致し/
、lhsがないため返されません=