我有这个代码用于在下划线之后对字符串进行trucating" _"已找到,但我不了解通过gsub传递的运算符/参数,以使此操作成为可能。特别是,为什么我需要gsub" \\ 1"而不是""。我注意到gsubbing的输出没有删除整个字符串。我对运营商的使用方式也有点困惑,特别是parantheses和括号:
AAA <- "ATGAS_1121"
(aa <- gsub("([^_]*).*", "\\1", AAA))
## [1] "ATGAS"
请注意,这篇文章大量借鉴:R remove part of string
谢谢,我很感激。
答案 0 :(得分:6)
在正则表达式(..)
中称为捕获组,它捕获与该组中存在的模式匹配的所有字符。您可以通过反向引用组索引号来引用这些字符。
gsub("([^_]*).*", "\\1", AAA)
([^_]*)
会在开始时捕获所有字符,但不会捕获_
零次或多次。 .*
跟随所有剩余字符。 gsub
将使用替换部分中的字符替换所有匹配的字符。如果你的代码是,
gsub("([^_]*).*", "", AAA)
它将删除所有字符,因为我们匹配了所有字符,但只捕获了开头存在的那些字符(不是_
符号)。因此,通过将匹配的字符替换为组索引1中存在的字符,将为您提供_
符号之前的部分。
您可以使用\K
> gsub("[^_]*\\K.*", "", AAA, perl = TRUE)
[1] "ATGAS"
由于\K
是PCRE功能,因此您必须启用perl=TRUE
参数。 \K
使文本与整个正则表达式匹配保持匹配。
答案 1 :(得分: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"