在R中定义的字符串集之间提取文本的简便方法

时间:2016-01-31 06:33:43

标签: regex r

我有一些带有已定义标签的文字,需要根据标签拆分文字。 例如,给定标签设置为{A,B,C ..}

的文本
text <- c("A: how are you B: hello sir C: bye bye")
text2 <- c("USER COMMENTS: TEST PROC: Refer manual. SOLUTION: fix BIAS32 user:param", "TEST PROC: install spare unit. USER COMMENTS: hello sir SOLUTION: tighten bolt 12","TEST PROC: bye bye.")

我需要提取文字&#34;你好吗&#34;,&#34;你好先生&#34;等等。对应于标签A,B等。 没有特定的标签顺序,某些标签可能会丢失,标签可能是短语(不仅仅是字符)

这是我到目前为止提取的与标签A相对应的文字:

gsub("(.*A.*:)(.*)(B.*|C.*)","\\2",text,perl=TRUE) 

但这在很多情况下都不起作用! 我正在寻找一个解决方案,我可以定义标签的矢量,如

labels <- c("USER COMMENTS", "TEST PROC", "SOLUTION") # this is a big list!

并提取与这些标签对应的文字,如下所示

用户评论&#34;&#34;,&#34;你好先生&#34; TEST PROC是&#34;参考手册。&#34;,&#34;安装备用设备。&#34;,&#34;再见。&#34; 解决方案是&#34;修复BIAS32用户:param&#34;,&#34;拧紧螺栓12&#34; 等。

1 个答案:

答案 0 :(得分:0)

我想我可能有一个基于Sharath评论的解决方案。

首先,有strsplit(),可以根据正则表达式分割矢量。在您的情况下,您可以使用:

labels2<-paste(labels,collapse="|")
[1] "USER COMMENTS|TEST PROC|SOLUTION"

如果你对它应用strsplit:

splittedtext<-strsplit(text2,labels2)
[[1]]
[1] ""                        ": "                     
[3] ": Refer manual. "        ": fix BIAS32 user:param"

[[2]]
[1] ""                       ": install spare unit. " ": hello sir "          
[4] ": tighten bolt 12"     

[[3]]
[1] ""           ": bye bye."

你想要什么,对吗?您可以通过添加&#34;:&#34;来进行一些改进。到每个索引的末尾,第一个元素都是乱码。所以照顾后者:

splittedtext<-lapply(splittedtext,"[",-1)

这就产生了一个问题,你必须弄清楚评论所适用的标签。为此,您可以在R。

中使用regexpr()函数
pos=sapply(labels,regexpr,text2)
USER COMMENTS TEST PROC SOLUTION
[1,]             1        16       41
[2,]            32         1       57
[3,]            -1         1       -1

每个单元格表示所述标签[column]出现在字符串[row]上的位置。 -1表示它不会出现在此字符串中。

现在切换,-1表示NA,并对剩余数字进行排名。这将为您提供哪个字符串片段代表该标签。

pos=ifelse(pos==-1,NA,pos) #switch -1 for NA
pos=t(apply(pos,1,rank,na.last="keep"))
USER COMMENTS TEST PROC SOLUTION
[1,]             1         2        3
[2,]             2         1        3
[3,]            NA         1       NA

现在它只是匹配。