正则表达式删除不相关的键值 - R
Regex to remove irrelevant keyvalues - R
我正在尝试构建一个 regex 以从列表中删除所有不需要的键值。在下面的示例中,我试图保持与变量 rev、qty、code 和 zip 关联的值。忽略输出中的其余部分(State、DMA、Source 等):
示例:
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
这看起来像你想要的东西。
rev=.*?(;|$)|code=.*?;|qty=.*?;|zip=.*?;
假设 rev 始终是最后一个标签(因为它没有以 ; 结尾)。否则,您必须使用 (;|$) 检查所有标签。
但您也可以对其进行解析,这样性能会更好 - 但我想它必须是 RegEx。
我们可以创建一个白名单并将术语粘贴在一起以构建 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))
我正在尝试构建一个 regex 以从列表中删除所有不需要的键值。在下面的示例中,我试图保持与变量 rev、qty、code 和 zip 关联的值。忽略输出中的其余部分(State、DMA、Source 等):
示例:
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
这看起来像你想要的东西。
rev=.*?(;|$)|code=.*?;|qty=.*?;|zip=.*?;
假设 rev 始终是最后一个标签(因为它没有以 ; 结尾)。否则,您必须使用 (;|$) 检查所有标签。
但您也可以对其进行解析,这样性能会更好 - 但我想它必须是 RegEx。
我们可以创建一个白名单并将术语粘贴在一起以构建 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))