如何在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 中使用正则表达式来查找字符串作为整个单词(但不是字符串作为单词的一部分)