R:正则表达式可以匹配多个管道

Parseltongue

我有一个数据集,其中将值粘贴到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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章