R:从KeyValue列表中提取不同的模式

时间:2017-11-30 22:41:10

标签: r key-value data-science

我有一个类似于:

的数据集
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

我试图从以下数据中提取一个键值模式(&#34; code&#34;):

      city code
1  Atlanta  ATL
2 New York   NY
3  Atlanta  ATL
4    Tampa  TPA

2 个答案:

答案 0 :(得分:2)

我们可以使用正面的背后隐藏法使用正则表达式

quest$code <- gsub(".*(?<=code=)(\\w+)(;|$).*", "\\1", quest$key_value, perl = TRUE)

.* - 与我们的后卫相匹配

(?<=code=) - 匹配字符串中前面字符为&#34; code =&#34;

的位置

(\\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

实例

https://regex101.com/r/UM7Cim/4

答案 1 :(得分:2)

您可以使用strcapture返回正则表达式的捕获部分:

cbind(quest, 
   strcapture(
     "code=([^;]*)",
     quest$key_value,
     data.frame(code=character())))

正则表达式"code=([^;]*)"查找文本code=,然后捕获不是分号的所有内容。 data frame参数指定返回值的名称和类型。在这里,我使用cbind返回带有额外列的数据框。

> 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