R:从键值列表中提取不同的模式
R: Extract distinct pattern from KeyValue list
我有一个类似于以下内容的数据集:
quest<-data.frame(city=c("Atlanta","New York","Atlanta","Tampa"), key_value=c("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"))
对应于:
city key_value
1 Atlanta rev=63;code=ATL;qty=1;zip=45987
2 New York rev=10.60|34;qty=1|2;zip=12686|12694;code=NY
3 Atlanta code=ATL;rev=12;qty=1;zip=74268
4 Tampa rev=3|24|8;qty=1|6|3;code=TPA;zip=33684|36842|30254
我试图从数据中仅提取一个键值模式 ("code"),如下所示:
city code
1 Atlanta ATL
2 New York NY
3 Atlanta ATL
4 Tampa TPA
我们可以使用正向后视的正则表达式来做到这一点
quest$code <- gsub(".*(?<=code=)(\w+)(;|$).*", "\1", quest$key_value, perl = TRUE)
.*
- 符合我们的回顾
(?<=code=)
- 匹配字符串中前面字符为 "code="
的位置
(\w+)
- 匹配代码并在第一组中捕获它。
(;|$)
- 匹配分号或字符串结尾(在 NY 的情况下,后面没有分号)
.*
- 匹配字符串的剩余部分
city key_value code
1 Atlanta rev=63;code=ATL;qty=1;zip=45987 ATL
2 New York rev=10.60|34;qty=1|2;zip=12686|12694;code=NY NY
3 Atlanta code=ATL;rev=12;qty=1;zip=74268 ATL
4 Tampa rev=3|24|8;qty=1|6|3;code=TPA;zip=33684|36842|30254 TPA
实例
您可以使用 strcapture
,其中 return 是正则表达式的捕获部分:
cbind(quest,
strcapture(
"code=([^;]*)",
quest$key_value,
data.frame(code=character())))
正则表达式 "code=([^;]*)"
查找文本 code=
,然后捕获所有不是分号的内容。数据框参数指定 returned 值的名称和类型。这里我使用 cbind
到 return 一个带有额外列的数据框。
> cbind(quest, strcapture("code=([^;]*)",quest$key_value,data.frame(code=character())))
city key_value code
1 Atlanta rev=63;code=ATL;qty=1;zip=45987 ATL
2 New York rev=10.60|34;qty=1|2;zip=12686|12694;code=NY NY
3 Atlanta code=ATL;rev=12;qty=1;zip=74268 ATL
4 Tampa rev=3|24|8;qty=1|6|3;code=TPA;zip=33684|36842|30254 TPA
我有一个类似于以下内容的数据集:
quest<-data.frame(city=c("Atlanta","New York","Atlanta","Tampa"), key_value=c("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"))
对应于:
city key_value
1 Atlanta rev=63;code=ATL;qty=1;zip=45987
2 New York rev=10.60|34;qty=1|2;zip=12686|12694;code=NY
3 Atlanta code=ATL;rev=12;qty=1;zip=74268
4 Tampa rev=3|24|8;qty=1|6|3;code=TPA;zip=33684|36842|30254
我试图从数据中仅提取一个键值模式 ("code"),如下所示:
city code
1 Atlanta ATL
2 New York NY
3 Atlanta ATL
4 Tampa TPA
我们可以使用正向后视的正则表达式来做到这一点
quest$code <- gsub(".*(?<=code=)(\w+)(;|$).*", "\1", quest$key_value, perl = TRUE)
.*
- 符合我们的回顾
(?<=code=)
- 匹配字符串中前面字符为 "code="
(\w+)
- 匹配代码并在第一组中捕获它。
(;|$)
- 匹配分号或字符串结尾(在 NY 的情况下,后面没有分号)
.*
- 匹配字符串的剩余部分
city key_value code
1 Atlanta rev=63;code=ATL;qty=1;zip=45987 ATL
2 New York rev=10.60|34;qty=1|2;zip=12686|12694;code=NY NY
3 Atlanta code=ATL;rev=12;qty=1;zip=74268 ATL
4 Tampa rev=3|24|8;qty=1|6|3;code=TPA;zip=33684|36842|30254 TPA
实例
您可以使用 strcapture
,其中 return 是正则表达式的捕获部分:
cbind(quest,
strcapture(
"code=([^;]*)",
quest$key_value,
data.frame(code=character())))
正则表达式 "code=([^;]*)"
查找文本 code=
,然后捕获所有不是分号的内容。数据框参数指定 returned 值的名称和类型。这里我使用 cbind
到 return 一个带有额外列的数据框。
> cbind(quest, strcapture("code=([^;]*)",quest$key_value,data.frame(code=character())))
city key_value code
1 Atlanta rev=63;code=ATL;qty=1;zip=45987 ATL
2 New York rev=10.60|34;qty=1|2;zip=12686|12694;code=NY NY
3 Atlanta code=ATL;rev=12;qty=1;zip=74268 ATL
4 Tampa rev=3|24|8;qty=1|6|3;code=TPA;zip=33684|36842|30254 TPA