2017-07-05 10 views
0

は、このような文字列のリストChessNotationを持って、最後の動きを見つけるためにRh5 34.a5 Rg5 35.Ra8 Rg4 1/2-1/2「
」36.Bd4 Bxb3 37.Rxc7 + Bxc738.axb3a6 39.h3Ke6 40.g4 1-0「
」34.b4 Ra8 35. NG5 Rxa3 36 NF3 Rb3を37 KG3 Rxb4 38 H4 KF6 39 NG1 KF5 0-1" "25 RAD1 QC6 26 QB8 1-0"解析チェスの表記文字列は数

私は最後の移動数を解析したいですそれぞれから。 だから、上記の結果は、次のようになります。26、35、40、39、26

当初の計画は、スペースでstr_splitし、その後、私は結果のリストで3番目の最後または第四最後のエントリを必要とするかどうかを把握することでした。

問題:文字列の文字列のベクトルから長さを取得する方法がわかりません。私が行う場合:

長(str_split(ChessNotation、」「))

を私は5を取得し、ChessNotationリスト内のエントリ数。私は各str_splitリストのエントリの数を持つベクトルを取り戻す必要があります。

各リストの長さを取得したり、一般的に必要な移動番号を解析する方法については、私は助けていただきたいと思います。

正規表現の仕方はわかりませんが、誰かがこのインスタンスを作成する方法を指摘できれば完璧かもしれません。

ありがとうございます!

答えて

0

パッケージstringrは、特に正規表現を知らないので、あなたにとって役に立ちます。ビネットは、多くの例を紹介します。

ここには、そのパッケージのstr_extract_allを使用したソリューションがあります。

library(stringr) 
x <- list("26. Qb7 Qc6 0-1", 
      "31. g3 Rh2 32. a4 Rxh3 33. Kg2 Rh5 34. a5 Rg5 35. Ra8 Rg4 1/2-1/2", 
      "36. Bd4 Bxb3 37. Rxc7+ Bxc7 38. axb3 a6 39. h3 Ke6 40. g4 1-0", 
      "34. b4 Ra8 35. Ng5 Rxa3 36. Nf3 Rb3 37. Kg3 Rxb4 38. h4 Kf6 39. Ng1 Kf5 0-1", 
      "25. Rad1 Qc6 26. Qb8 1-0") 

extract_func <- function(x) { 
    x2 <- unlist(str_extract_all(x, "\\d*\\.")) 
    as.numeric(x2[length(x2)]) 
} 

unlist(lapply(x, extract_func)) 

[1] 26 35 40 39 26 
0

ここsimplish方法です:

data = data.frame(x = c("26. Qb7 Qc6 0-1", 
         "31. g3 Rh2 32. a4 Rxh3 33. Kg2 Rh5 34. a5 Rg5 35. Ra8 Rg4 1/2-1/2", 
         "36. Bd4 Bxb3 37. Rxc7+ Bxc7 38. axb3 a6 39. h3 Ke6 40. g4 1-0")) 
splits = str_split(data$x, pattern = " ") 
last_move = function(x){ 
    x[max(grep(pattern = "^[0-9]+\\.$", x = x))] 
} 
data$last_moves = mapply(FUN = last_move, x = splits)