2015-02-24 101 views
3

我找到了下划线“_”后用于固定字符串的代码,但我不理解通过gsub传递的操作符/参数,以使此操作成为可能。特别是,为什么我需要gsub“\\ 1”而不是“”。我注意到gsubbing的输出没有删除整个字符串。我还如何被使用的运营商有点混乱,特别是括号和括号:有人可以请解释这些gsub参数吗?

AAA <- "ATGAS_1121" 
(aa <- gsub("([^_]*).*", "\\1", AAA)) 
## [1] "ATGAS" 

请注意,这个职位从大量借鉴:R remove part of string

谢谢,我很感激。

+1

[' “([^ _ *)*。”'](HTTP:// rick.measham.id.au/paste/explain.pl?regex=%28%5B%5E_%5D*%29.*) – rawr 2015-02-24 16:29:24

回答

6

在正则表达式(..)中调用捕获组,该捕获组捕获该组内存在的模式所匹配的所有字符。您可以通过反向引用组索引号来引用这些字符。

gsub("([^_]*).*", "\\1", AAA) 

([^_]*)捕获所有字符开始,但不是_零次或多次。以下.*匹配所有剩余的字符。 gsub将用替换部分中的字符替换所有匹配的字符。如果你的代码是什么样子,

gsub("([^_]*).*", "", AAA) 

它会删除所有的字符,因为我们匹配所有的字符,但捕获只有那些字符(_符号),它存在于开始。因此,通过用组号1中存在的字符替换匹配的字符,将会给出_符号之前的部分。

你可以使用\K

> gsub("[^_]*\\K.*", "", AAA, perl = TRUE) 
[1] "ATGAS" 

由于\K是PCRE功能实现同样的结果,你必须需要启用perl=TRUE参数。 \K使文本与整体正则表达式匹配保持一致。

+0

或者你可以只做'gsub(“_。*”,“”,AAA) ' – 2015-02-24 16:45:39

+0

我认为'sub'对所有人都是足够的。 – 2015-02-24 16:46:42

+0

精彩,谢谢! – 2015-02-24 17:41:48

1

为什么我应该有GSUB的\\1代替""

一个back-reference告诉引擎匹配被捕获组捕获的字符。通过将字符分组在一组括号内,可以创建一个捕获组,(...)。从左到右的每组捕获括号都会被分配一个数字,无论引擎在评估匹配时是否使用这些括号。

在这种情况下,您需要使用替换调用中的后引用\1将组1匹配的字符分配到新字符串aa。通过使用""来代替,因为正则表达式模式与整个字符串匹配,所以您将为aa分配一个空值。

我也受了一点是如何被使用的运营商感到困惑......括号

的方括号[ ... ]你问被称为character class定义了一组字符。说—“匹配一个由类指定的字符”。

我怎么会推荐这样做:

在这个例子中,是没有必要的正则表达式,你可以简单地拆分字符串。

AAA <- 'ATGAS_1121' 
strsplit(AAA, '_', fixed=T)[[1]][1] 
# [1] "ATGAS" 

如果你坚持使用正则表达式,你可以使用sub作为代替如下:

AAA <- 'ATGAS_1121' 
sub('_.*', '', AAA) 
# [1] "ATGAS" 
相关问题