R 从文本文件中提取特定单词?
我有一个超过10000行的文本文件,每行都有一个单词,以CDID\uu开头,后面还有10个字符,没有空格,如下所示: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
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+”)