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

时间:2018-09-05 16:02:54

标签: r

我有一个数据集,我将值粘贴到dplyr链中,并用竖线字符折叠(例如“ |”)。如果数据集中的任何值为空白,我只会在粘贴列表中得到重复的管道字符。

其中一些值如下所示:

badstring = "| | | | | | GHOULSBY,SCROGGINS | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | CAT,JOHNSON | | | | | | | | | | | | BURGLAR,PALA | | | | | | | | |"

我想匹配所有不止一次出现的管道并删除它们,以使名称看起来像这样:

correctstring = "| GHOULSBY,SCROGGINS | CAT,JOHNSON | |BURGLAR,PALA |"

我尝试了以下操作,但无济于事:

mutate(names = gsub('[\\|]{2,}', '', name_list)) 

1 个答案:

答案 0 :(得分:1)

这个问题的难点在于制定一个正则表达式,该正则表达式可以有选择地删除每个管道,但我们希望保留它们作为术语之间的实际分隔符的管道除外。我们可以按照以下模式进行匹配:

\|\s+(?=\|)

,然后仅替换空字符串。只要遵循的是另一个管道,此模式将删除所有管道(以及随后的空白)。当在管道后面加上实际的字词或在字符串的末尾跟上删除时,不会发生。

badstring = "| | | | | | GHOULSBY,SCROGGINS | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | CAT,JOHNSON | | | | | | | | | | | | BURGLAR,PALA | | | | | | | | |"

result <- gsub("\\|\\s+(?=\\|)", "", badstring, perl=TRUE)
result

[1] "| GHOULSBY,SCROGGINS | CAT,JOHNSON | BURGLAR,PALA |"

Demo

编辑:

如果您希望输入诸如| | |之类的没有任何术语的输入,并且希望将空字符串作为输出,那么我的解决方案将失败。我看不到修改上述正则表达式的明显方法,但是您可以通过再调用sub来处理这种情况:

result <- sub("^\\|$", "", result)

我们也许还可以修改原始模式以使用覆盖所有情况的替代方式:

result <- gsub("\\|\\s+(?=\\|)|(?:^\\|$)", "", badstring, perl=TRUE)