使用R中的正则表达式提取子字符串

时间:2018-01-22 16:45:59

标签: r regex gsub

我是正则表达式的新手,已阅读http://www.gastonsanchez.com/Handling_and_Processing_Strings_in_R.pdf正则表达式文档。我知道之前已经发布了类似的问题,但我仍然很难弄清楚我的情况。

我有一个字符串文件名向量,尝试提取子字符串,并另存为新文件名。文件名遵循以下模式:

\w_\w_(substring to extract)_\d_\d_Month_Date_Year_Hour_Min_Sec_(AM or PM)

例如,ABC_DG_MS-15-0452-268_206_281_12_1_2017_1_53_11_PM,ABC_RE_SP56-01_A_206_281_12_1_2017_1_52_34_AM,子串将为MS-15-0452-268和SP56-01_A

我用过

map(strsplit(filenames, '_'),3)

但失败了,因为新的文件名也可能有_。

我转向正则表达式进行高级匹配,并提出这个

gsub("^[^\n]+_\\d_\\d_\\d_\\d_(AM | PM)$", "", filenames)

仍然没有得到我需要的东西。

2 个答案:

答案 0 :(得分:1)

您可以使用

filenames <- c('ABC_DG_MS-15-0452-268_206_281_12_1_2017_1_53_11_PM', 'ABC_RE_SP56-01_A_206_281_12_1_2017_1_52_34_AM')
gsub('^(?:[^_]+_){2}(.+?)_\\d+.*', '\\1', filenames)

哪个收益

[1] "MS-15-0452-268" "SP56-01_A"    

<小时/> 这里的模式是

^             # start of the string
(?:[^_]+_){2} # not _, twice
(.+?)         # anything lazily afterwards
_\\d+         # until there's _\d+
.*            # consume the rest of the string

此模式由第一个捕获的组替换,因此替换为相关文件名。

答案 1 :(得分:0)

叫我一个黑客。但如果确保这是我所有字符串的格式,那么我只会使用strsplit将名称分开,然后只保留我想要的内容:

string <- 'ABC_DG_MS-15-0452-268_206_281_12_1_2017_1_53_11_PM'
string_bits <- strsplit(string, '_')[[1]]
file_name<- string_bits[3]
file_name

[1] "MS-15-0452-268"

如果你有一个包含许多文件名的列表,你可以删除明确的[[1]]使用sapply()来获取每个文件名的第三个元素:

sapply(string_bits, "[[", 3)