正则表达式来去除不相关的键值 - R的

问题描述 投票:1回答:2

我试图建立一个正则表达式,从列表中删除所有不需要的键值。在下面的例子中,我试图保持与变量相关的值REV,数量,代码和邮政编码。而忽略了从输出其余的(国家,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
r regex key-value
2个回答
1
投票

我们可以创建一个白名单和条款粘贴在一起,以建立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
投票

这确实的东西看起来像你想有。

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

假设,即转速总是最后标签(因为它不与封端的)。否则,你必须检查所有的标签用(; | $)来代替。

但你可以在它解析为好,这将是更好的性能 - 但我想它必须是正则表达式。

© www.soinside.com 2019 - 2024. All rights reserved.