如何使用正则表达式将柯本气候图例转换为指定格式CSV文件
正则匹配失败原因
你当前使用的正则存在两个核心问题:
- 贪婪匹配规则下
.*会尽可能吞噬更多字符,无法精准切割编码、描述两个字段 - 没有设置独立的捕获组来分别提取气候编码和描述内容,仅有的一个捕获组只能抓到单个字符,不符合提取需求
正确实现方案(R语言)
正则规则设计
使用如下正则,设置两个捕获组分别抓取编码和描述,用非[字符限制匹配范围避免贪婪问题:
^\\s*\\d{1,2}:\\s+([A-Za-z]{2,3})\\s+([^\\[]+?)\\s+\\[
规则拆解:
^\\s*:匹配行首可能存在的空白字符\\d{1,2}:\\s+:匹配序号、冒号及后续空格([A-Za-z]{2,3}):第一个捕获组,提取2-3位的气候编码\\s+:编码和描述之间的空格([^\\[]+?):第二个捕获组,非贪婪匹配所有不是左括号[的字符,即完整的气候描述内容\\s+\\[:匹配描述末尾到颜色数组左括号之间的空格和左括号
完整代码示例
library(stringr) # 此处替换为你的原始文本内容 raw_text <- " 1: Af Tropical, rainforest [0 0 255] 2: Am Tropical, monsoon [0 120 255] 3: Aw Tropical, savannah [70 170 250] 4: BWh Arid, desert, hot [255 0 0] 5: BWk Arid, desert, cold [255 150 150] 6: BSh Arid, steppe, hot [245 165 0] 7: BSk Arid, steppe, cold [255 220 100] 8: Csa Temperate, dry summer, hot summer [255 255 0] 9: Csb Temperate, dry summer, warm summer [200 200 0] 10: Csc Temperate, dry summer, cold summer [150 150 0] 11: Cwa Temperate, dry winter, hot summer [150 255 150] 12: Cwb Temperate, dry winter, warm summer [100 200 100] 13: Cwc Temperate, dry winter, cold summer [50 150 50] 14: Cfa Temperate, no dry season, hot summer [200 255 80] 15: Cfb Temperate, no dry season, warm summer [100 255 80] 16: Cfc Temperate, no dry season, cold summer [50 200 0] 17: Dsa Cold, dry summer, hot summer [255 0 255] 18: Dsb Cold, dry summer, warm summer [200 0 200] 19: Dsc Cold, dry summer, cold summer [150 50 150] 20: Dsd Cold, dry summer, very cold winter [150 100 150] 21: Dwa Cold, dry winter, hot summer [170 175 255] 22: Dwb Cold, dry winter, warm summer [90 120 220] 23: Dwc Cold, dry winter, cold summer [75 80 180] 24: Dwd Cold, dry winter, very cold winter [50 0 135] 25: Dfa Cold, no dry season, hot summer [0 255 255] 26: Dfb Cold, no dry season, warm summer [55 200 255] 27: Dfc Cold, no dry season, cold summer [0 125 125] 28: Dfd Cold, no dry season, very cold winter [0 70 95] 29: ET Polar, tundra [178 178 178] 30: EF Polar, frost [102 102 102]" # 按行拆分文本 lines <- str_split(raw_text, "\\n")[[1]] # 正则匹配提取字段 matches <- str_match(lines, "^\\s*\\d{1,2}:\\s+([A-Za-z]{2,3})\\s+([^\\[]+?)\\s+\\[") # 整理为数据框,去除空值、清理多余空格 climate_df <- na.omit(data.frame( code = matches[,2], description = str_squish(matches[,3]), stringsAsFactors = FALSE )) # 导出为CSV文件 write.csv(climate_df, "koppen_climate.csv", row.names = FALSE, quote = TRUE)
运行后会在工作目录生成符合要求的CSV文件,包含code(气候编码)和description(气候描述)两个字段。
内容的提问来源于stack exchange,提问作者Lenn
相关产品推荐
相关产品推荐

