如何在两个标点之间替换单词

时间:2018-03-21 22:35:47

标签: r regex

我有一个类似于以下

的数据集
sentence <-  
    "active ingredients: avobenzone, octocrylene, octyl salicylate. 
    other stuff inactive ingredients: water, glycerin, edta."

我正试着

    "avobenzone, octocrylene, octyl salicylate, water, glycerin, edta."

我用普通英语思考的逻辑与标点符号和分号之间的任何内容相匹配以删除它们。或者,在字符串开头和分号之间匹配并删除它们。我在r中使用gsub并且到目前为止已经到了这里:

     gsub("([:punct:][^:]*:)|^([^:]*:)", "", sentence)

但我的结果是......

    [1] " avobe water, glycerin, edta."

为什么这会抓住第一个单词到最后一个分号而不是第一个单词之间的所有内容?有人能指出我正确的方向来理解这个逻辑吗?

谢谢!

1 个答案:

答案 0 :(得分:8)

至少有一种方式:

gsub(".*?:\\s*(.*?)\\.", "\\1, ", sentence)
[1] "avobenzone, octocrylene, octyl salicylate, water, glycerin, edta, "

注意?之后。*这使匹配不贪婪。没有?,。*匹配尽可能多。

增加:

这样做的想法是替换之外的所有部分。你说你想停在标点符号上,但你显然不想停留在逗号上,所以我冒昧地将问题解释为找到冒号和句号之间的刺痛部分。在我的表达式中,.*?:匹配第一个冒号的所有内容。我放入\\ s *也删除了可能跟随冒号的任何空格。在此之后我们想要一切直到下一个时期。这由。*?\\表示。但是我们想要保留这一部分,所以我把它放在括号中,使它成为一个“捕获组”。因为它在parens中,冒号和句点之间的任何内容都将存储在名为\ 1的变量中(但是你必须输入\\ 1来获取字符串\ 1)。我还在捕获组的末尾添加了“,”(逗号空白),以帮助将其与接下来的任何内容分开。所以这将需要 active ingredients: avobenzone, octocrylene, octyl salicylate.并将其替换为avobenzone, octocrylene, octyl salicylate,。由于我使用了gsub(全局替换),它将重新开始并尝试对字符串的其余部分执行相同的操作,将other stuff inactive ingredients: water, glycerin, edta.替换为water, glycerin, edta,。抱歉丑陋的尾随“,”。