【问题标题】:R:how to get grep to return the match, rather than the whole stringR:如何让grep返回匹配项,而不是整个字符串
【发布时间】:2011-02-27 11:58:34
【问题描述】:

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

我有一个字符串向量,我们称之为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 访问的任何内容之间的区别的网页的奖励标记。

【问题讨论】:

标签: r regex


【解决方案1】:

试试 stringr 包:

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

【讨论】:

  • 太棒了。不要认为 stringr 有使用 perl 正则表达式的计划吗?还是通常情况下应该始终使用 R 的方言?
  • @Mike 您可以通过将正则表达式字符串包装在perl() 中来在stringr 中使用perl 正则表达式。见?perl
  • @SamFirke 不再
  • @hadley 这对我有用:str_extract("20004ABCreturnthispartDE", perl("(?&lt;=ABC)(.*)(?=DE)")) 但不是没有perl()
  • @SamFirke 现在使用“regex”而不是“perl”字符串
【解决方案2】:

你可以这样做:

pat <- ".*\\.D([0-9]+)\\.LIS.*"
sub(pat, "\\1", alice)

如果您只想要与您的模式匹配的 alice 的子集,请尝试以下操作:

pat <- ".*\\.D([0-9]+)\\.LIS.*"
sub(pat, "\\1", alice[grepl(pat, alice)])

【讨论】:

  • 太棒了。非常感谢。我没有想过用比赛替换这条线,而是我痴迷地想“为什么它不会把比赛还给我啊!”。我可能也应该停止使用那些前瞻和后视的东西是吗?我的大脑还不能很好地使用正则表达式。我似乎倒退了。
  • 我刚刚遇到了上面 Ken Williams 使用的正则表达式功能。这是惊人的。我相信它被称为标记。一个人可以写一个正则表达式,它的一个或多个部分可以放在未转义的括号/括号中。 sub 或 gsub 函数允许使用 \\1 或 \\2 分别粘贴在第一对非转义括号或第二对非转义括号中的匹配项。在此处阅读更多信息books.google.com/…
猜你喜欢
  • 2018-12-11
  • 2015-08-17
  • 1970-01-01
  • 2019-11-27
  • 2018-02-28
  • 1970-01-01
  • 2018-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多