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

R 从文本文件中提取特定单词?,r,regex,R,Regex,我有一个超过10000行的文本文件,每行都有一个单词,以CDID\uu开头,后面还有10个字符,没有空格,如下所示: a <- c("Test CDID_1254WE_1023 Sky","CDID_1254XE01478 Blue","This File named as CDID_ZXASWE_1111") 我将使用带有stringi包的lookback: a <- c("Test CDID_1254WE_1023 Sky","CDID_1254XE01478 Blue","T

我有一个超过10000行的文本文件,每行都有一个单词,以CDID\uu开头,后面还有10个字符,没有空格,如下所示:

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

我将使用带有stringi包的lookback:

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_[^ ]+)')

您可能需要使用
unlist
将其强制为一个向量。

我会对stringi包使用lookback:

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_[^ ]+)')

您可能需要使用
取消列表
将其强制为向量。

以下是三个基本R选项

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

sub(".*(CDID_\\S+).*", "\\1", a)
# [1] "CDID_1254WE_1023" "CDID_1254XE01478" "CDID_ZXASWE_1111"
regmatches(a, regexpr("CDID_\\S+", a))
# [1] "CDID_1254WE_1023" "CDID_1254XE01478" "CDID_ZXASWE_1111"
选项2:使用
regexpr()
,提取
CDID.*
部分:

sub(".*(CDID_\\S+).*", "\\1", a)
# [1] "CDID_1254WE_1023" "CDID_1254XE01478" "CDID_ZXASWE_1111"
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

这里有三个基本的R选项

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

sub(".*(CDID_\\S+).*", "\\1", a)
# [1] "CDID_1254WE_1023" "CDID_1254XE01478" "CDID_ZXASWE_1111"
regmatches(a, regexpr("CDID_\\S+", a))
# [1] "CDID_1254WE_1023" "CDID_1254XE01478" "CDID_ZXASWE_1111"
选项2:使用
regexpr()
,提取
CDID.*
部分:

sub(".*(CDID_\\S+).*", "\\1", a)
# [1] "CDID_1254WE_1023" "CDID_1254XE01478" "CDID_ZXASWE_1111"
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

所有其他解决方案都很好。下面是一个使用
stringr
包中函数的解决方案。我们可以首先使用
str\u split
按空格拆分字符串,将结果列表转换为向量,然后使用
str\u subset
获得开头带有
CDID\ucode>的字符串

library(stringr)

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

所有其他解决方案都很好。下面是一个使用
stringr
包中函数的解决方案。我们可以首先使用
str\u split
按空格拆分字符串,将结果列表转换为向量,然后使用
str\u subset
获得开头带有
CDID\ucode>的字符串

library(stringr)

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

同样
stringr::str_extract(string=a,pattern=“CDID\\S+”)
同样
stringr::str_extract(string=a,pattern=“CDID\\S+”)