如何在R语言中从PGN国际象棋记谱字符串提取特定时钟数值?
从PGN国际象棋记谱字符串提取时钟时间数值(R语言实现)
对于你的需求,用正则表达式匹配比strsplit()更高效,因为目标数值嵌在固定格式的{[%clk ...]}标记里。下面给你两种实现方式:
方法一:使用stringr包(新手友好)
stringr是R中处理字符串的常用包,语法直观易读:
- 先安装并加载包(如果还没安装的话):
install.packages("stringr") library(stringr)
- 定义原始PGN字符串并提取数值:
# 原始PGN字符串 pgn_str <- "1. e4 {[%clk 0:00:59.5]} 1... b6 {[%clk 0:00:57.4]} 2. Nc3 {[%clk 0:00:59.4]} 2... Bb7 {[%clk 0:00:57.2]}" # 提取时钟时间的小数部分 clk_times <- str_extract_all(pgn_str, "(?<=\\[%clk\\s\\d{2}:\\d{2}:)\\d+\\.\\d")[[1]] # 可选:转换为数值类型(方便后续计算) clk_times_num <- as.numeric(clk_times)
运行后,clk_times会得到字符向量["59.5", "57.4", "59.4", "57.2"],clk_times_num则是对应的数值向量。
方法二:基础R实现(无需额外包)
如果不想安装新包,可以用基础R的正则匹配函数:
# 原始PGN字符串 pgn_str <- "1. e4 {[%clk 0:00:59.5]} 1... b6 {[%clk 0:00:57.4]} 2. Nc3 {[%clk 0:00:59.4]} 2... Bb7 {[%clk 0:00:57.2]}" # 启用Perl正则模式匹配目标数值 matches <- regmatches(pgn_str, gregexpr("(?<=\\[%clk\\s\\d{2}:\\d{2}:)\\d+\\.\\d", pgn_str, perl = TRUE))[[1]] # 可选:转换为数值类型 matches_num <- as.numeric(matches)
正则表达式说明
(?<=\\[%clk\\s\\d{2}:\\d{2}:)是正向预查,用来定位[%clk 00:00:这个固定前缀;\\d+\\.\\d则匹配你需要的“数字+小数点+一位数字”格式(比如59.5)。
内容的提问来源于stack exchange,提问作者burns22
相关产品推荐
相关产品推荐

