2015-02-24 88 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" 
相關問題