在R中提取字符串的部分

4
我有一个字符串,格式如下:
stamp = "section_d1_2010-07-01_08_00.txt"

我希望能够提取其中的某些部分。我已经通过重复使用str_extract来获取我想要的部分,例如抓取月份。

month = str_extract(stamp,"2010.+")
month = str_extract(month,"-..")
month = str_extract(month,"..$")

然而,这种方式非常低效,必须有更好的方法。对于这个特定的例子,我可以使用。
month = substr(stamp,17,18)

然而我正在寻找更加通用的内容(以防数字数量发生变化)。 我认为我需要正则表达式来捕获某些标志后面的内容(下划线或连字符,或第三个下划线之后的内容)。我也尝试使用sub函数,但遇到相同的问题,需要多次精细调整才能得到我想要的结果。如果能举例说明如何获取月份(此处为07)和小时(此处为08)将不胜感激。

你是否期望输入字符串始终具有相同的宽度? - Tim Biegeleisen
你在我的帖子中尝试过使用 gsubstr_extract 吗? - akrun
谢谢@akrun,这正是我所需要的。 - Esme_
不可以 - 字符数可能会改变(这就是为什么我不能只使用substr)。 - Esme_
2个回答

4
您可以简单地使用带有正则表达式[-_]perl=TRUE选项的strsplit来获取所有部分。
stamp <- "section_d1_2010-07-01_08_00.txt"
strsplit(stamp, '[-_]')[[1]]
# [1] "section" "d1"      "2010"    "07"      "01"      "08"      "00.txt" 

See demo.

https://regex101.com/r/cK4iV0/8


2
你可以尝试。
gsub('^.*_\\d+-|-\\d+_.*$', '', stamp)
#[1] "07"

对于这个小时

library(stringr)
str_extract(stamp, '(?<=\\d_)\\d+(?=_\\d)')
#[1] "08"

提取两者
 str_extract_all(stamp, '(?<=\\d{4}[^0-9])\\d{2}|\\d{2}(?=[^0-9]\\d{2}\\.)')[[1]]
 #[1] "07" "08"

能否请@akrun解释一下正则表达式呢?我想提取所有被字母夹在中间的数字。在上面的例子中,我无法解码提取“-”字符之间数字的正则表达式。 - Sky Scraper
根据您的建议,我尝试了以下代码:str_extract('(?<=^[[:alpha:]]+)[0-9]+(?=[[:alpha:]]+)', "Glu741ArgfsTer30") - Sky Scraper
不确定为什么会返回“NA”。 - Sky Scraper
str_extract("Glu741ArgfsTer30", '(?<=[A-z]{3})\d+(?=[A-Z]+)' )是答案。我不知道为什么要使用{3}而不是+ - Sky Scraper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接