如何在r中使用正则表达式删除单词之前的所有措辞?

Posted

技术标签:

【中文标题】如何在r中使用正则表达式删除单词之前的所有措辞?【英文标题】:How to remove all wording before a word using regex in r? 【发布时间】:2022-01-17 09:09:06 【问题描述】:

我想删除“不”之前的单词。当我尝试下面的代码 sn-p 时,我没有得到预期的结果。

test <- c("this will not work.", "'' is not one of ['A', 'B', 'C'].", "This one does not use period ending!")
gsub(".*(not .*)\\.", "\\1", test)

但是如果我用[[:punct:]] 替换\\.,它就可以正常工作。谁能告诉我为什么第一个不起作用?我可能需要保留除句号以外的其他标点符号。

预期输出:

> not work
> not one of ['A', 'B', 'C']
> not use period ending!

谢谢!

【问题讨论】:

【参考方案1】:

这是您的原始代码的翻译:

    匹配任意字符零次或更多次 捕捉单词时不要使用一个空格,然后是零次或多次后的任何字符。 匹配一个句点。

如果表达式不匹配这个模式,包括那个一个句点,你将不会得到匹配,gsub() 也不会这样做。因此,添加 [[:punct:]] 是有意义的,因为您会说:“匹配该模式中的所有内容,然后匹配任何类型的标点符号,而不仅仅是一个句点。

如果你不想使用 [[:punct:]] 你可以使用这个

(?:.*(not\\s+.*)\\.?).+?$

上面写着

    以下是未捕获组 匹配任意字符 0 次或更多次 捕获“非”一个或多个空格零个或多个任意字符 下一个可选匹配句点 可选择匹配任意字符一次或多次 匹配行尾

这个正则表达式给出这样的输出:

[1] "not work"                   "not one of ['A', 'B', 'C']"
[3] "not use period ending" 

上面的例子确实去掉了“!”不过,如果你想保留它,我会使用 [[:punct:]] 或者你可以说匹配这些标点符号中的任何一个,如下所示:

[!"\#$%&'()*+,\-./:;<=>?@\[\\\]^_‘|~]

但这太烦人了。 This website should help give you an even better understanding.希望我能帮上忙!

【讨论】:

【参考方案2】:

您可以使用前瞻正则表达式删除"not" 之前的所有内容,并删除末尾的句点。

gsub('.*(?=not)|\\.$', '', test, perl = TRUE)
#[1] "not work"     "not one of ['A', 'B', 'C']" "not use period ending!"

【讨论】:

【参考方案3】:
sub('.*(not.*?)\\.?$', '\\1', test)

[1] "not work"                   "not one of ['A', 'B', 'C']"
[3] "not use period ending!"   

【讨论】:

我确实想删除结束期。

以上是关于如何在r中使用正则表达式删除单词之前的所有措辞?的主要内容,如果未能解决你的问题,请参考以下文章

如何从文本中删除所有字母数字单词?

提取单词和单词之前,并在正则表达式中的“_”之间插入

如何使用正则表达式排除单词?

在 R 中使用正则表达式来查找字符串作为整个单词(但不是字符串作为单词的一部分)

如何使用正则表达式和 Notepad++ 删除所有非 ASCII 字符?

使用扫描方法+正则表达式将字符串分解为单词,如果单词有`'`字符,则删除该字符及其后面的所有内容