我有一个如下所示的数据集
sentence <-
"active ingredients: avobenzone, octocrylene, octyl salicylate.
other stuff inactive ingredients: water, glycerin, edta."
Run Code Online (Sandbox Code Playgroud)
我想要得到
"avobenzone, octocrylene, octyl salicylate, water, glycerin, edta."
Run Code Online (Sandbox Code Playgroud)
我用简单的英语思考的逻辑与标点符号和分号之间的任何内容相匹配以删除它们.或者,在字符串开头和分号之间匹配并删除它们.我在r中使用gsub并且到目前为止已经到了这里:
gsub("([:punct:][^:]*:)|^([^:]*:)", "", sentence)
Run Code Online (Sandbox Code Playgroud)
但我的结果是......
[1] " avobe water, glycerin, edta."
Run Code Online (Sandbox Code Playgroud)
为什么这会抓住第一个单词到最后一个分号而不是第一个单词之间的所有内容?有人能指出我正确的方向来理解这个逻辑吗?
谢谢!
至少有一种方法是:
gsub(".*?:\\s*(.*?)\\.", "\\1, ", sentence)
[1] "avobenzone, octocrylene, octyl salicylate, water, glycerin, edta, "
Run Code Online (Sandbox Code Playgroud)
请注意?之后.*这使匹配不贪婪.没有?,.*匹配尽可能多.
这样做的想法是替换除了你想要的部分之外的所有东西.你说你想停在标点符号上,但你显然不想停留在逗号上,所以我冒昧地将问题解释为找到冒号和句号之间的刺痛部分.在我的表达式中,.*?:将所有内容与第一个冒号匹配.我放入\\ 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,.抱歉丑陋的尾随",".