我有一个包含多个列的数据集,其中一个(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
答案 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"