[英]Could someone please explain these gsub arguments precisely?
我有這個代碼用於在找到下划線“_”之后對字符串進行trucating,但是我不理解通過gsub傳遞的運算符/參數以使這種操作成為可能。 特別是,為什么我應該gsub“\\\\ 1”而不是“”。 我注意到gsubbing的輸出沒有刪除整個字符串。 我對運營商的使用方式也有點困惑,特別是parantheses和括號:
AAA <- "ATGAS_1121"
(aa <- gsub("([^_]*).*", "\\1", AAA))
## [1] "ATGAS"
請注意,這篇文章大量借鑒: R刪除部分字符串
謝謝,我很感激。
在regex (..)
稱為捕獲組,它捕獲與該組內存在的模式匹配的所有字符。 您可以通過反向引用組索引號來引用這些字符。
gsub("([^_]*).*", "\\1", AAA)
([^_]*)
捕獲開頭但不是_
零次或多次的所有字符。 以下.*
匹配所有剩余的字符。 gsub
將用替換部分中的字符替換所有匹配的字符。 如果您的代碼是,
gsub("([^_]*).*", "", AAA)
它將刪除所有字符,因為我們匹配所有字符但只捕獲了開頭存在的那些字符( 不是_
符號 )。 因此,通過將匹配的字符替換為組索引1中存在的字符,將為您提供_
符號之前的部分。
使用\\K
可以獲得相同的結果
> gsub("[^_]*\\K.*", "", AAA, perl = TRUE)
[1] "ATGAS"
由於\\K
是PCRE功能,因此您必須啟用perl=TRUE
參數。 \\K
保持文本匹配到目前為止整個正則表達式匹配。
為什么我應該使用gsub \\\\1
而不是""
反向引用告訴引擎匹配捕獲組捕獲的字符。 可以通過將要分組的字符放在一組括號( ... )
內來創建捕獲組。 從左到右的每組捕獲括號都會被賦予一個數字,無論引擎在評估匹配時是否使用這些括號。
在這種情況下,您需要使用替換調用內部的反向引用\\1
將分組1匹配的字符分配給新字符串aa
。 通過使用""
不是,你要指定aa
空值,因為正則表達式模式匹配整個字符串。
我對運營商的使用方式也有點困惑......括號
方括號[ ... ]
你問被稱為字符類定義了一組字符。 說 - “匹配類指定的一個字符”。
我怎么建議這樣做:
在此示例中,根本不需要正則表達式,您可以簡單地拆分字符串。
AAA <- 'ATGAS_1121'
strsplit(AAA, '_', fixed=T)[[1]][1]
# [1] "ATGAS"
如果你堅持使用正則表達式,你可以使用sub
代替如下:
AAA <- 'ATGAS_1121'
sub('_.*', '', AAA)
# [1] "ATGAS"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.