使用向量中的元素的 R grep 正则表达式(跟进) [英] R grep regular expression using elements in a vector (FOLLOW UP)

查看:50
本文介绍了使用向量中的元素的 R grep 正则表达式(跟进)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

跟进这个问题,我还有另一个例子,我不能使用接受的答案.

Following up on this question, I have another example where I cannot use the accepted answer.

同样,我想在 lab 向量中找到每个精确的 group 元素...

Again, I want to find each of the exact group elements in the lab vector...

labs <- c("Beijing -- T0 -- BC-89 + CN",
"Beijing -- T24 -- BC-89 + CN",
"Beijing -- T0 -- BC-89 + CN with 2% DD + 1.6% ZC",
"Beijing -- T24 -- BC-89 + CN with 2% DD + 1.6% ZC",
"Beijing -- T0 -- BC-89 with 2% Puricare + 5% Merquat + CN",
"Beijing -- T24 -- BC-89 with 2% Puricare + 5% Merquat + CN",
"Beijing -- T0 -- BC-89 + CN",
"Zhangjiakou -- T0 -- BC-89 + CN",
"Beijing -- T0 -- BC-89 + CN with 2% DD + 1.6% ZC",
"Zhangjiakou -- T0 -- BC-89 + CN with 2% DD + 1.6% ZC",
"Beijing -- T0 -- BC-89 with 2% Puricare + 5% Merquat + CN",
"Zhangjiakou -- T0 -- BC-89 with 2% Puricare + 5% Merquat + CN",
"Beijing -- T0 -- BC-89 + CN",
"Beijing -- T0 -- BC-89 + CN",
"Beijing -- T0 -- BC-89 + CN with 2% DD + 1.6% ZC",
"Beijing -- T24 -- BC-89 + CN",
"Beijing -- T24 -- BC-89 + CN",
"Beijing -- T24 -- BC-89 + CN with 2% DD + 1.6% ZC",
"Zhangjiakou -- T0 -- BC-89 + CN",
"Zhangjiakou -- T0 -- BC-89 + CN",
"Zhangjiakou -- T0 -- BC-89 + CN with 2% DD + 1.6% ZC",
"Zhangjiakou -- T24 -- BC-89 + CN",
"Zhangjiakou -- T24 -- BC-89 + CN",
"Zhangjiakou -- T24 -- BC-89 + CN with 2% DD + 1.6% ZC")
labs
groups <- c("BC-89 + CN", "BC-89 + CN with 2% DD + 1.6% ZC", "BC-89 with 2% Puricare + 5% Merquat + CN")
groups

我尝试了以下但它不起作用...

I try the following but it does not work...

grep(paste0(groups[1], "$"), labs, value=TRUE)
grep(paste0(groups[2], "$"), labs, value=TRUE)
grep(paste0(groups[3], "$"), labs, value=TRUE)

有什么帮助吗?

推荐答案

尝试

lapply(groups, function(g)
  grep(gsub("\\+", "\\\\+", paste0(g, "$")), labs, value = TRUE))
# [[1]]
# [1] "Beijing -- T0 -- BC-89 + CN"     
# [2] "Beijing -- T24 -- BC-89 + CN"    
# [3] "Beijing -- T0 -- BC-89 + CN"     
# [4] "Zhangjiakou -- T0 -- BC-89 + CN" 
# [5] "Beijing -- T0 -- BC-89 + CN"     
# [6] "Beijing -- T0 -- BC-89 + CN"     
# [7] "Beijing -- T24 -- BC-89 + CN"    
# [8] "Beijing -- T24 -- BC-89 + CN"    
# [9] "Zhangjiakou -- T0 -- BC-89 + CN" 
# [10] "Zhangjiakou -- T0 -- BC-89 + CN" 
# [11] "Zhangjiakou -- T24 -- BC-89 + CN"
# [12] "Zhangjiakou -- T24 -- BC-89 + CN"
# 
# [[2]]
# [1] "Beijing -- T0 -- BC-89 + CN with 2% DD + 1.6% ZC"     
# [2] "Beijing -- T24 -- BC-89 + CN with 2% DD + 1.6% ZC"    
# [3] "Beijing -- T0 -- BC-89 + CN with 2% DD + 1.6% ZC"     
# [4] "Zhangjiakou -- T0 -- BC-89 + CN with 2% DD + 1.6% ZC" 
# [5] "Beijing -- T0 -- BC-89 + CN with 2% DD + 1.6% ZC"     
# [6] "Beijing -- T24 -- BC-89 + CN with 2% DD + 1.6% ZC"    
# [7] "Zhangjiakou -- T0 -- BC-89 + CN with 2% DD + 1.6% ZC" 
# [8] "Zhangjiakou -- T24 -- BC-89 + CN with 2% DD + 1.6% ZC"
# 
# [[3]]
# [1] "Beijing -- T0 -- BC-89 with 2% Puricare + 5% Merquat + CN"    
# [2] "Beijing -- T24 -- BC-89 with 2% Puricare + 5% Merquat + CN"   
# [3] "Beijing -- T0 -- BC-89 with 2% Puricare + 5% Merquat + CN"    
# [4] "Zhangjiakou -- T0 -- BC-89 with 2% Puricare + 5% Merquat + CN"

您的方法的问题在于,例如,groups[1]"BC-89 + CN",其中包含 +,在正则表达式中具有特殊意义.仅鉴于此,在 grep 中添加 fixed = TRUE 可以解决问题,但是 $ 将失去其效果.所以我所做的是首先在组名中转义 +.

The problem with your approach is that, e.g., groups[1] is "BC-89 + CN", which contains +, having particular meaning in regular expressions. Given only this, adding fixed = TRUE in grep would fix the issue, but then $ would lose its effect. So what I did is escaping + in the group names first.

或者,关于您的链接答案,您可以这样做

Alternatively, and relating to your linked answer, you could do

lapply(groups, function(g)
  grep(paste0(g, "$"), paste0(labs, "$"), value = TRUE, fixed = TRUE))

这篇关于使用向量中的元素的 R grep 正则表达式(跟进)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆