我有一个数据集,其中将值粘贴到dplyr链中,并使用竖线字符(例如“ |”)折叠。如果数据集中的任何值都为空,那么我只会在粘贴列表中得到重复的管道字符。
其中一些值如下所示:
badstring = "| | | | | | GHOULSBY,SCROGGINS | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | CAT,JOHNSON | | | | | | | | | | | | BURGLAR,PALA | | | | | | | | |"
我想匹配所有不止一次出现的管道,并删除它们,以使名称看起来像这样:
correctstring = "| GHOULSBY,SCROGGINS | CAT,JOHNSON | |BURGLAR,PALA |"
我尝试了以下操作,但无济于事:
mutate(names = gsub('[\\|]{2,}', '', name_list))
这个问题的难点在于制定一个正则表达式,该正则表达式可以有选择地删除每条管道,但我们希望保留为术语之间的实际分隔符的管道除外。我们可以按照以下模式进行匹配:
\|\s+(?=\|)
然后替换为空字符串。只要遵循的是另一个管道,此模式将删除任何管道(以及随后的空白)。当在管道后面加上一个实际术语时,或者在该字符串后面加上字符串时,都不会发生删除。
badstring = "| | | | | | GHOULSBY,SCROGGINS | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | CAT,JOHNSON | | | | | | | | | | | | BURGLAR,PALA | | | | | | | | |"
result <- gsub("\\|\\s+(?=\\|)", "", badstring, perl=TRUE)
result
[1] "| GHOULSBY,SCROGGINS | CAT,JOHNSON | BURGLAR,PALA |"
编辑:
如果您希望像| | |
这样的输入不包含任何术语,并且希望将空字符串作为输出,那么我的解决方案将失败。我看不到一种修改上述regex的明显方法,但是您可以通过再调用以下方法来处理这种情况sub
:
result <- sub("^\\|$", "", result)
我们还可以修改原始模式以使用覆盖所有情况的替代方式:
result <- gsub("\\|\\s+(?=\\|)|(?:^\\|$)", "", badstring, perl=TRUE)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句