我有一个超过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
答案 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"