使用正则表达式将 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的主要内容,如果未能解决你的问题,请参考以下文章