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

4
我是一名新手,对于正则表达式还不太熟悉。我已经阅读了 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)

我还没有得到所需的内容。


你实际上想要在这里提取什么?请注意,\w 缩写代表 [a-zA-Z0-9_] (参见下划线)。 - Jan
我已经更新了我的帖子,以针对子字符串。 - Jian
2个回答

2
您可以使用:
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

这个模式将被第一个捕获的组替换,因此是相关的文件名。


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)

我使用了map函数,但问题是子字符串中可能会有“_”。我可以尝试使用paste函数重构所需的子字符串,但听起来很复杂。 - Jian

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