使用正则表达式将 Koeppen Climate Legend 变成有意义的 csv

Posted

技术标签:

【中文标题】使用正则表达式将 Koeppen Climate Legend 变成有意义的 csv【英文标题】:Turn Koeppen Climate Legend into meaningful csv with regex 【发布时间】:2022-01-11 18:07:04 【问题描述】:

我有这张桌子:

    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]

首先:将其放入 csv 真的很难... 我想要代码(第一列)和详细描述(例如第一行的Tropical, rainforest)。所以我想我会用正则表达式来处理这个问题。但显然我正在理解正则表达式的工作原理。我尝试在 R 中进行此操作,但我将非常感谢您的帮助。

我尝试过这样的事情:

str_match(a, "\\d1,2:\\s[a-zA-Z]2,3.*([a-zA-Z,]).*\\[") 但它失败了...

【问题讨论】:

可能是str_match(a, "(\\d1,2):\\s*(.*?)\\s*\\[(.*)\\]")? 也许还可以看看read.fwf 读取固定宽度格式文件 或者,(\\d1,2):\\s*(\\w+)\\s*(.*?)\\s*\\[(.*)\\]...见regex demo。 哇哈哈,非常感谢!!我一定会看你的正则表达式快速课程:) 您将数据称为表格,原始格式是什么?解决方案可能会从以不同的方式读取它开始,这可能会阻止之后修复数据的需要。 【参考方案1】:

你可以使用任何一个

str_match(a, "(\\d1,2):\\s*(.*?)\\s*\\[(.*)\\]")
str_match(a, "(\\d1,2):\\s*(\\w+)\\s*(.*?)\\s*\\[(.*)\\]")

请参阅regex demo #1 和regex demo #2。

详情

(\d1,2) - 第 1 组:一位或两位数 :\s* - : 和零个或多个空格 (\w+) - 第 2 组:一个或多个字母、数字或 _ \s* - 零个或多个空格 (.*?) - 第 3 组:除换行符之外的任何零个或多个字符,尽可能少 \s* - 零个或多个空格 \[ - 一个 [ 字符 (.*) - 第 4 组:除换行符之外的任何零个或多个字符,尽可能多 \] - 一个 ] 字符。

【讨论】:

【参考方案2】:

准备了example,对吧? screenshot 由于数据包含逗号,所以制作制表符分隔符

const regex = /(\d+): +\w+ +([^\[]+).*/gm;
const str = `    
    1:  Af   Tropical, rainforest                  [0 0 255]
    2:  Am   Tropical, monsoon                     [0 120 255]
    3:  Aw   Tropical, savannah                    [70 170 250]
    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]`;
const subst = `$1\t$2`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);

【讨论】:

【参考方案3】:

使用这个正则表达式:

([0-9]+):(?:\s+)([a-zA-Z]+)(?:\s+)(.*?)\s*\[(.*)\]

Demo

[0-9]+ : to get number part.

(?:\s+)([a-zA-Z]+)(?:\s+)(.*?)\s* : match description part

\[(.*)\] : match between brackets part

【讨论】:

以上是关于使用正则表达式将 Koeppen Climate Legend 变成有意义的 csv的主要内容,如果未能解决你的问题,请参考以下文章

如何使用正则表达式,将字符串中的每个单词首字母大写

我将使用啥代码将类似 SQL 的表达式即时转换为正则表达式?

如何使用正则表达式将数字格式化为货币

将RegEx(正则表达式提取器)与JMeter一起使用

使用正则表达式将字符串拆分为句子

使用正则表达式将十六进制转换为ascii