我是正则表达式的新手,已阅读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)
仍然没有得到我需要的东西。
答案 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)