#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);