R:如何让 grep 返回匹配项,而不是整个字符串

标签 r regex

我有一个可能非常愚蠢的grep在 R 问题中。抱歉,因为这看起来应该很容易 - 我显然只是错过了一些东西。

我有一个字符串向量,我们称之为 alice 。一些alice打印如下:

T.8EFF.SP.OT1.D5.VSVOVA#4   
T.8EFF.SP.OT1.D6.LISOVA#1  
T.8EFF.SP.OT1.D6.LISOVA#2   
T.8EFF.SP.OT1.D6.LISOVA#3  
T.8EFF.SP.OT1.D6.VSVOVA#4    
T.8EFF.SP.OT1.D8.VSVOVA#3  
T.8EFF.SP.OT1.D8.VSVOVA#4   
T.8MEM.SP#1                
T.8MEM.SP#3                      
T.8MEM.SP.OT1.D106.VSVOVA#2 
T.8MEM.SP.OT1.D45.LISOVA#1  
T.8MEM.SP.OT1.D45.LISOVA#3

我希望 grep 给出其中一些字符串中出现的 D 后面的数字,条件是包含“LIS”的字符串和空字符串或其他字符串。

我希望 grep 能够返回捕获组的值而不是整个字符串。这是我的 R 风格的正则表达式:

pattern <- (?<=\\.D)([0-9]+)(?=.LIS)

没什么太复杂的。但为了得到我想要的东西,而不是仅仅使用 grep(pattern, alice, value = TRUE, perl = TRUE)我正在执行以下操作,这似乎很糟糕:

reg.out <- regexpr(
    "(?<=\\.D)[0-9]+(?=.LIS)",
    alice,
    perl=TRUE
)
substr(alice,reg.out,reg.out + attr(reg.out,"match.length")-1)

现在看起来并不算太难看,但是为了让这个微不足道的东西发挥作用所花费的精力却令人尴尬。有人知道如何正确处理这个问题吗?

将我指向一个网页的奖励分数,该网页解释了我使用 $ 访问的内容之间的区别, @attr .

最佳答案

尝试 stringr 包:

library(stringr)
str_match(alice, ".*\\.D([0-9]+)\\.LIS.*")[, 2]

关于R:如何让 grep 返回匹配项,而不是整个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2969315/

相关文章:

r - data.table 按行求和,平均值,最小值,最大值,如 dplyr?

r - 从具有指定样本量的组中进行简单随机抽样

Javascript 正则表达式与非捕获组作为两种选择

c# - 替换/删除与正则表达式 (.NET) 不匹配的字符

regex - 捕获组中带有贪婪修饰符的奇怪行为

r - 如何获取大数据帧每一行中特定元素的数量?

Roxygen2 文档依赖函数

javascript高效解析css选择器

r - 计算给定条件的百分比

java - 拆分列表中的右子字符串