Regex для удаления неактуальных значений ключей - R - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь создать регулярное выражение , которое удаляет все нежелательные значения ключа из списка.В приведенном ниже примере я пытаюсь сохранить значения, связанные с переменными rev, qty, code и zip .При игнорировании остальных ( Состояние, DMA, Источник и т. Д. ) с выхода:

Пример:

rev=63;code=ATL;qty=1;zip=45987;location=Atlanta
rev=10.60|34;State=New York;qty=1|2;zip=12686|12694;code=NY;
code=ATL;rev=12;qty=1;zip=74268;Source=69752|458
rev=3|24|8;qty=1|6|3;code=TPA;zip=33684|36842|30254;DMA=TampaBay
State=Florida;qty=1|6|3;code=TPA;zip=33684|36842|30254;rev=3|24|8

ЖелаемыйВыход:

rev=63;code=ATL;qty=1;zip=45987
rev=10.60|34;qty=1|2;zip=12686|12694;code=NY
code=ATL;rev=12;qty=1;zip=74268
rev=3|24|8;qty=1|6|3;code=TPA;zip=33684|36842|30254
qty=1|6|3;code=TPA;zip=33684|36842|30254;rev=3|24|8

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Мы можем создать белый список и вставить термины вместе, чтобы построить регулярное выражение для str_extract_all:

library(tidyverse)

whitelist <- c("rev", "qty", "code", "zip")
regex_pattern <- paste(paste0("(?<=^|;)", whitelist, "\\=.+?(?=;|$)"), collapse = "|")

df %>%
  mutate(V1 = str_extract_all(V1, regex_pattern) %>% map(paste, collapse = ";"))

Вывод:

                                                   V1
1                     rev=63;code=ATL;qty=1;zip=45987
2        rev=10.60|34;qty=1|2;zip=12686|12694;code=NY
3                     code=ATL;rev=12;qty=1;zip=74268
4 rev=3|24|8;qty=1|6|3;code=TPA;zip=33684|36842|30254
5 qty=1|6|3;code=TPA;zip=33684|36842|30254;rev=3|24|8

Данные:

df <- structure(list(V1 = structure(c(4L, 2L, 1L, 3L, 5L), .Label = c("code=ATL;rev=12;qty=1;zip=74268;Source=69752|458", 
"rev=10.60|34;State=New York;qty=1|2;zip=12686|12694;code=NY;", 
"rev=3|24|8;qty=1|6|3;code=TPA;zip=33684|36842|30254;DMA=TampaBay", 
"rev=63;code=ATL;qty=1;zip=45987;location=Atlanta", "State=Florida;qty=1|6|3;code=TPA;zip=33684|36842|30254;rev=3|24|8"
), class = "factor")), class = "data.frame", row.names = c(NA, 
-5L))
0 голосов
/ 07 февраля 2019

Это выглядит так, как вы хотели.

 rev=.*?(;|$)|code=.*?;|qty=.*?;|zip=.*?; 

при условии, что rev всегда является последним тегом (так как он не заканчивается на;).В противном случае вы должны проверить все теги с помощью (; | $) вместо этого.

Но вы также можете проанализировать его, что будет более производительным - но я думаю, что это должен быть RegEx.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...