有人可以准确地解释这些gsub参数吗?

时间:2015-02-24 16:26:12

标签: regex r

我有这个代码用于在下划线之后对字符串进行trucating" _"已找到,但我不了解通过gsub传递的运算符/参数,以使此操作成为可能。特别是,为什么我需要gsub" \\ 1"而不是""。我注意到gsubbing的输出没有删除整个字符串。我对运营商的使用方式也有点困惑,特别是parantheses和括号:

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

请注意,这篇文章大量借鉴:R remove part of string

谢谢,我很感激。

2 个答案:

答案 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"