如果我有以下字符向量:
names(x)
[1] "EMM88 emm88.0 (emm-cluster E4)" "EMM225 emm225.0 (emm-cluster D4)"
[3] "EMM52 emm52.0 (emm-cluster D4)" "EMM2 emm2.0 (emm-cluster E4)"
[5] "EMM114 emm114.0 (emm-cluster E4)"
我想保留“EMM?”包括数字的部分(例如“EMM88 emm88.0(emm-cluster E4)”中的“EMM88”),我可以使用以下代码:
names(x) <- gsub("(.*?) .*", "\\1", names(x))
并提供所需的输出:
names(x)
[1] "EMM88" "EMM225" "EMM52" "EMM2" "EMM114"
我已经阅读了“gsub”和其他一些问题的文档,但仍然在努力理解代码如何导致预期的结果。
我理解第一个参数("(.*?) .*", "\\1"
)是在第二个参数(names(x)
)中寻找的模式。
我不理解(.*?)
,
.*
表示任意数量的字符,那么将它们合并到(.*?) .*
是什么意思?
添加"\\1"
会有什么作用?
正如您所看到的,我缺少一些“通配符”和“gsub”编码知识的基础知识,任何帮助都非常感激。
答案 0 :(得分:3)
.*?
尝试停止字符串中的每个字符,但正则表达式引擎想要报告整体匹配,并且需要匹配第一个捕获组之后的空白,因此它会尝试停在每个字符处直到它最终到达第一个空白。到目前为止的所有字符都存储在第一个捕获组中 - 在替换部分中称为\\1
表达式的其余部分使用字符串的其余部分,字符串仅替换为第一个捕获组。
一般来说,点星是“昂贵的”(发动机会试图停在每个角色上),如果可能的话应该避免使用。
names(x) <- gsub("([^ ]+).*", "\\1", names(x))
代替。这可以捕获第一组中不是空白的任何内容,并且可能更快地结束。