Превратите климатическую легенду Кеппена в значимый csv с помощью регулярного выражения

#r #regex

#r #регулярное выражение

Вопрос:

У меня есть эта таблица:

     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, "\d{1,2}:\s[a-zA-Z]{2,3}.*([a-zA-Z,]).*\[") но это не удается…

Комментарии:

1. Может str_match(a, "(\d{1,2}):\s*(.*?)\s*\[(.*)\]") быть ?

2.Возможно, также посмотрите на read.fwf файлы формата Read с фиксированной шириной.

3. Или, (\d{1,2}):\s*(\w )\s*(.*?)\s*\[(.*)\] … Смотрите демонстрацию регулярных выражений.

4. вау, хаха, большое вам спасибо!! Я обязательно посмотрю ваш курс быстрого обучения регулярным выражениям 🙂

5. Вы ссылаетесь на свои данные в виде таблицы, каков исходный формат? Решение может начаться с чтения его другим способом, что может в первую очередь предотвратить необходимость последующей фиксации данных.

Ответ №1:

Вы можете использовать либо

 str_match(a, "(\d{1,2}):\s*(.*?)\s*\[(.*)\]")
str_match(a, "(\d{1,2}):\s*(\w )\s*(.*?)\s*\[(.*)\]")
 

Смотрите демонстрацию регулярных выражений # 1 и демонстрацию регулярных выражений # 2.

Подробные сведения:

  • (d{1,2}) — Группа 1: одна или две цифры
  • :s* : и ноль или более пробелов
  • (w ) — Группа 2: одна или несколько букв, цифр или _
  • s* — ноль или более пробелов
  • (.*?) — Группа 3: любые нулевые или более символов, кроме символов разрыва строки, как можно меньше.
  • s* — ноль или более пробелов
  • [ [ символ
  • (.*) — Группа 4: любые нулевые или более символов, кроме символов разрыва строки, как можно больше
  • ] ] символ.

Ответ №2:

Подготовил пример, верно? скриншот, поскольку данные содержат запятые, сделаны разделителями табуляции

 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 = `$1t$2`;

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

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