获取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 

对于每一个,我只想返回最后四个单词。我最初想用正则表达式来实现这一点,但我很确定,当字符串短于四个单词时(后三种情况也是如此),这是行不通的。此外,当单词之间除了空格之外还有其他字符时,我提出的regex就不起作用了(就像第二行的情况一样)。请在此处查看我的正则表达式示例。

.*(?=(bw+s){4}$)

那么,我如何去掉R中的最后四个单词(它们之间的所有单词)?

对于上面给出的块,结果看起来像(如果不够,保留最后四个单词或更少):

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

首先要实现的是regex和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")

这样做:

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] ""

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

编辑:对不起,OP说"返回",然后说"脱衣服",我取"脱衣服"的意思是删除。

我一直在尝试修改我的正则表达式以满足需求,但值得注意的是,在我看来,R的正则表达式实现,至少在正则表达式中绑定了变量时,在替换字符串中扩展捕获组方面,已经崩溃了。在这种情况下,无法正确扩展替换字符串中的12等。

为了解决这个问题,我想出了一个破解方法,使用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"

最新更新