在R中解析国际象棋符号字符串以查找最后一个移动编号

时间:2017-07-05 14:22:26

标签: r chess

有一个像ChessNotation这样的字符串列表:

“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”

我想解析每个的最后一个移动数字。 因此上面的结果将是:26,35,40,39,26

最初的计划是str_split with space,然后弄清楚我是否需​​要结果列表中的第3个最后一个或第4个最后一个条目。

问题是:我无法弄清楚如何从字符串字符串向量中获取长度。如果我这样做:

长度(str_split(ChessNotation,''))

我得到5,ChessNotation列表中的条目数。我需要返回一个包含每个str_split列表中条目数的向量。

我很感激获得每个列表的长度或者如何解析我一般需要的移动号码的任何帮助。

我应该注意到我不知道如何做正则表达式,但如果有人能指出如何为这个实例做这些也是完美的。

谢谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这是一种简洁的方法:

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)