从文本文件中提取特定单词?

时间:2017-09-01 00:35:01

标签: r regex

我有一个超过10,000行的文本文件,每行都有一个以 CDID _ 开头的单词,后面跟着10个不带空格的字符,如下所示:

a <- c("Test CDID_1254WE_1023 Sky","CDID_1254XE01478 Blue","This File named as CDID_ZXASWE_1111")

我想提取以 CDID _ 开头的单词,只是为了使上面的行看起来像这样:

CDID_1254WE_1023
CDID_1254XE01478
CDID_ZXASWE_1111

3 个答案:

答案 0 :(得分:6)

以下是三个基本R选项。

选项1:使用sub(),删除CDID_*部分以外的所有内容:

sub(".*(CDID_\\S+).*", "\\1", a)
# [1] "CDID_1254WE_1023" "CDID_1254XE01478" "CDID_ZXASWE_1111"

选项2 :使用regexpr(),解压缩CDID_*部分:

regmatches(a, regexpr("CDID_\\S+", a))
# [1] "CDID_1254WE_1023" "CDID_1254XE01478" "CDID_ZXASWE_1111"

选项3:对于数据框结果,我们可以使用新的strcapture()函数(v3.4.0)并在一次调用中完成所有工作:

strcapture(".*(CDID_\\S+).*", a, data.frame(out = character()))
#                out
# 1 CDID_1254WE_1023
# 2 CDID_1254XE01478
# 3 CDID_ZXASWE_1111

答案 1 :(得分:1)

我在 stringi 包中使用了lookbehind:

a <- c("Test CDID_1254WE_1023 Sky","CDID_1254XE01478 Blue","This File named as CDID_ZXASWE_1111")

library(stringi)

stringi::stri_extract_all_regex(a, '(?<=(^|\\s))(CDID_[^ ]+)')

(?<=(^|\\s)) =前面是行或空格的开头;然后CDID_和所有[^ ]+ =后面的字符不是空格。

[[1]]
[1] "CDID_1254WE_1023"

[[2]]
[1] "CDID_1254XE01478"

[[3]]
[1] "CDID_ZXASWE_1111"

您可能希望使用unlist将其强制转换为矢量。

答案 2 :(得分:1)

所有其他解决方案都很棒。以下是使用stringr包中的函数的一种解决方案。我们可以先使用str_split按空格分割字符串,将结果列表转换为矢量,然后使用str_subset在开头使用CDID_获取字符串。

library(stringr)

str_subset(unlist(str_split(a, pattern = " ")), "^CDID_")
[1] "CDID_1254WE_1023" "CDID_1254XE01478" "CDID_ZXASWE_1111"