Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:如何让grep返回匹配,而不是整个字符串_R_Regex - Fatal编程技术网

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

R:如何让grep返回匹配,而不是整个字符串,r,regex,R,Regex,我的问题可能是一个非常愚蠢的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#

我的问题可能是一个非常愚蠢的
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)
现在看来,它看起来并不太难看,但为了让这件微不足道的事情发挥作用,人们在这件事上花了太多的时间,这让人感到尴尬。有人对如何正确处理这件事有什么建议吗


将我指向一个网页,解释我使用
$
@
attr

访问的任何内容之间的区别,您可以这样做:

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

尝试stringr包:

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

令人惊叹的。非常感谢。我没有想到用火柴来代替这条线,而是痴迷地想:“它到底为什么不把火柴还给我呢?”。我可能也应该停止使用那些向前看和向后看的东西,嗯?我的大脑还不能很好地处理regexp。我似乎在想问题。我刚刚发现了Ken Williams在上面使用的正则表达式功能。真是太神奇了。我相信这就是标签。可以编写正则表达式,并且可以将其中的一个或多个部分放在不带scape的括号/括号中。sub或gsub函数允许使用\\1或\\2分别粘贴在第一对未替换方括号或第二对未替换方括号中的匹配项中。在这里读更多精彩的文章。难道没有计划让stringr使用perl正则表达式吗?或者通常情况下应该总是使用R的方言吗?@Mike您可以在
stringr
中使用perl regexps,方法是将regex字符串包装在
perl()
中。请参见
?perl
@SamFirke非任何more@hadley这对我来说很有用:
str_extract(“20004ABCreturnthispartDE”),perl((?@SamFirke现在使用“regex”而不是“perl”字符串。看起来这已经被问过了,并得到了回答。对于重复,我深表歉意!
pat <- ".*\\.D([0-9]+)\\.LIS.*"
sub(pat, "\\1", alice[grepl(pat, alice)])
library(stringr)
str_match(alice, ".*\\.D([0-9]+)\\.LIS.*")[, 2]