Regex 基于模式的R-操作字符串

Regex 基于模式的R-操作字符串,regex,r,string,Regex,R,String,这是我在R上的文件名: > lst.files[1] [1] "clt_Amon_CanESM2_rcp45_185001-230012.nc" 我需要做的是只捕获第四个下划线(包括)之前的部分,所以它是这样的: clt_Amon_CanESM2_rcp45_ regmatches(lst, regexec(".*_.*_.*_.*_", lst.files[1]))[[1]] # [1] "clt_Amon_CanESM2_rcp45_" regmatches(lst, regex

这是我在R上的文件名:

> lst.files[1]
[1] "clt_Amon_CanESM2_rcp45_185001-230012.nc"
我需要做的是只捕获第四个下划线(包括)之前的部分,所以它是这样的:

clt_Amon_CanESM2_rcp45_
regmatches(lst, regexec(".*_.*_.*_.*_", lst.files[1]))[[1]]
# [1] "clt_Amon_CanESM2_rcp45_"
regmatches(lst, regexec(".*_", lst.files[1]))[[1]]
# [1] "clt_Amon_CanESM2_rcp45_"

如何在R中获取此信息?

使用
qdap
包,您可以执行以下操作

x <- "clt_Amon_CanESM2_rcp45_185001-230012.nc"

library(qdap)
beg2char(x, "_", 4, include = TRUE)
# [1] "clt_Amon_CanESM2_rcp45_"

x使用
qdap
包,您可以执行以下操作

x <- "clt_Amon_CanESM2_rcp45_185001-230012.nc"

library(qdap)
beg2char(x, "_", 4, include = TRUE)
# [1] "clt_Amon_CanESM2_rcp45_"

x如果你知道你总是(至少)有四个下划线,那么你可以这样做:

clt_Amon_CanESM2_rcp45_
regmatches(lst, regexec(".*_.*_.*_.*_", lst.files[1]))[[1]]
# [1] "clt_Amon_CanESM2_rcp45_"
regmatches(lst, regexec(".*_", lst.files[1]))[[1]]
# [1] "clt_Amon_CanESM2_rcp45_"
如果第二部分中可能不总是四个下划线,但没有下划线,则可以执行以下操作:

clt_Amon_CanESM2_rcp45_
regmatches(lst, regexec(".*_.*_.*_.*_", lst.files[1]))[[1]]
# [1] "clt_Amon_CanESM2_rcp45_"
regmatches(lst, regexec(".*_", lst.files[1]))[[1]]
# [1] "clt_Amon_CanESM2_rcp45_"

这不需要任何额外的软件包,只需要以R为基数。

如果您知道您总是(至少)有四个下划线,那么您可以这样做:

clt_Amon_CanESM2_rcp45_
regmatches(lst, regexec(".*_.*_.*_.*_", lst.files[1]))[[1]]
# [1] "clt_Amon_CanESM2_rcp45_"
regmatches(lst, regexec(".*_", lst.files[1]))[[1]]
# [1] "clt_Amon_CanESM2_rcp45_"
如果第二部分中可能不总是四个下划线,但没有下划线,则可以执行以下操作:

clt_Amon_CanESM2_rcp45_
regmatches(lst, regexec(".*_.*_.*_.*_", lst.files[1]))[[1]]
# [1] "clt_Amon_CanESM2_rcp45_"
regmatches(lst, regexec(".*_", lst.files[1]))[[1]]
# [1] "clt_Amon_CanESM2_rcp45_"

这不需要任何额外的包,只需要基本的R。

我们还可以使用
sub
将重复模式作为一个组捕获。我们从字符串的开头(
^
)再匹配一个字符,该字符串不是下划线(
[^\+
),后跟一个下划线(
\\\\
),该下划线重复4次(
{4}
),通过用括号括起来,后跟零个或多个字符(
*
)将其作为一个组捕获。我们将其替换为捕获组(
\\1
),以获得预期的输出

sub('^(([^_]+\\_){4}).*', '\\1', str1)
#[1] "clt_Amon_CanESM2_rcp45_"
数据
str1我们还可以使用
sub
将重复模式作为一个组捕获。我们从字符串的开头(
^
)再匹配一个字符,该字符串不是下划线(
[^\+
),后跟一个下划线(
\\\\
),该下划线重复4次(
{4}
),通过用括号括起来,后跟零个或多个字符(
*
)将其作为一个组捕获。我们将其替换为捕获组(
\\1
),以获得预期的输出

sub('^(([^_]+\\_){4}).*', '\\1', str1)
#[1] "clt_Amon_CanESM2_rcp45_"
数据
str1回答得很好,但我更喜欢使用R的本机命令。我已经加载了太多的包,最终我会在一些命令之间产生冲突:d这个函数对我来说是新的+1@akrun我很高兴你发现这很有用。:)@爵士乐我在书中记下了这一点,以便下次使用:-)哇,你完成了超过7000个复习任务,令人印象深刻!回答得很好,但我更喜欢使用R的本地命令。我已经加载了太多的包,最终我会在一些命令之间产生冲突:d这个函数对我来说是新的+1@akrun我很高兴你发现这很有用。:)@爵士乐我在书中记下了这一点,以便下次使用:-)哇,你完成了超过7000个复习任务,令人印象深刻!