R中每列最后四个单词

时间:2015-03-31 18:23:01

标签: regex r

我有一个包含多个列的数据集,其中一个(d$leftContext)包含如下字符串:

Eens zien of je binnen een paar jaar , wanneer er hier misschien een 
Ik zou denken van wel , eens deze kerel verdwenen zullen er nog erger aan de macht komen , mensen , crimineel krankzinnig , en fanatiek godsdienstig genoeg om met atoombommen naar het westen te smijten...Die 
Die 
Die 
Als de 

对于其中的每一个,我想只返回最后四个单词。我首先想用正则表达式来做这个,但是我很确定当字符串短于四个单词时这将不起作用(在后三种情况下就是这种情况)。此外,当单词之间有任何其他字符而不是spacew时,我提出的正则表达式将不起作用(如第二行中的情况)。请参阅我的正则表达式here的示例。

.*(?=(\b\w+\s){4}$)

那么,我怎样才能在R中删除最后四个字(它们之间的所有内容)?

对于上面显示的块,结果看起来像(如果不够,则保留最后四个字或更少):

er hier misschien een
westen te smijten...Die 
Die 
Die 
Als de 

2 个答案:

答案 0 :(得分:3)

要实现的第一件事是正则表达式和R都使用反斜杠作为转义字符,因此在创建模式字符串时需要加倍“\”。这将返回4个单词和嵌入的分色,以查找字符类项" "",""."的列表。要逃脱的唯一角色是反斜杠。

> sub( patt='(.+)(([ ,.]+\\w+){4})[ ]?$', repl='\\2', Lines)
[1] " er hier misschien een"   " westen te smijten...Die" "Die "  
[4] "Die "                     "Als de"                  

它实际上并不匹配最后三个,因为它们实际上没有4个分隔符 - 单词模式。我需要输入最后的“[]?”因为复制的几行有尾随空格,这使得我的匹配变得混乱。

>dput(Lines)
c("Eens zien of je binnen een paar jaar , wanneer er hier misschien een ", 
"Ik zou denken van wel , eens deze kerel verdwenen zullen er nog erger aan de macht komen , mensen , crimineel krankzinnig , en fanatiek godsdienstig genoeg om met atoombommen naar het westen te smijten...Die ", 
"Die ", "Die ", "Als de")

答案 1 :(得分:1)

这样做:

df <- data.frame(leftContext=c('Eens zien of je binnen een paar jaar , wanneer er hier misschien een','Ik zou denken van wel , eens deze kerel verdwenen zullen er nog erger aan de macht komen , mensen , crimineel krankzinnig , en fanatiek godsdienstig genoeg om met atoombommen naar het westen te smijten...Die','Die','Die','Als de'), stringsAsFactors=F );
df$leftContext;
## [1] "Eens zien of je binnen een paar jaar , wanneer er hier misschien een"
## [2] "Ik zou denken van wel , eens deze kerel verdwenen zullen er nog erger aan de macht komen , mensen , crimineel krankzinnig , en fanatiek godsdienstig genoeg om met atoombommen naar het westen te smijten...Die"
## [3] "Die"
## [4] "Die"
## [5] "Als de"
sub('(\\b\\w+\\b\\W*){1,4}$','',df$leftContext);
## [1] "Eens zien of je binnen een paar jaar , wanneer "
## [2] "Ik zou denken van wel , eens deze kerel verdwenen zullen er nog erger aan de macht komen , mensen , crimineel krankzinnig , en fanatiek godsdienstig genoeg om met atoombommen naar het "
## [3] ""
## [4] ""
## [5] ""

关键是使用变量bound {1,4};确保如果少于四个单词,1:3尾随单词仍将被删除。此外,非空白分隔符很容易被\W覆盖,它匹配任何非单词字符。

编辑抱歉,OP说“返回”然后再“剥离”,我把“剥离”意味着删除。

我一直在努力修改我的正则表达式以完成要求,但值得注意的是,在我看来R的正则表达式实现,至少在正则表达式中存在变量限制时扩展替换字符串中的捕获组时, 被打破。在这些情况下,替换字符串中的\1\2等未能正确展开。

要解决这个问题,我已经找到了一个使用substr()来提取你想要的输入字符串的尾随部分的黑客:

df <- data.frame(leftContext=c('Eens zien of je binnen een paar jaar , wanneer er hier misschien een','Ik zou denken van wel , eens deze kerel verdwenen zullen er nog erger aan de macht komen , mensen , crimineel krankzinnig , en fanatiek godsdienstig genoeg om met atoombommen naar het westen te smijten...Die','Die','Die','Als de'), stringsAsFactors=F );
df$leftContext;
## [1] "Eens zien of je binnen een paar jaar , wanneer er hier misschien een"
## [2] "Ik zou denken van wel , eens deze kerel verdwenen zullen er nog erger aan de macht komen , mensen , crimineel krankzinnig , en fanatiek godsdienstig genoeg om met atoombommen naar het westen te smijten...Die"
## [3] "Die"
## [4] "Die"
## [5] "Als de"
substr(df$leftContext,nchar(sub('(\\b\\w+\\b\\W*){1,4}$','',df$leftContext))+1,nchar(df$leftContext));
## [1] "er hier misschien een"   "westen te smijten...Die" "Die"                     "Die"                     "Als de"