正则表达式中的问题

时间:2018-10-30 03:52:57

标签: r

e
Material     newvar1 
5000    4.28 > 5 > 5
5001    3 > 2 > 3 > 3

当我应用以下代码时

e$newvar2=sapply(str_extract_all(gsub("\\b(\\c+\\.\\c+)(?:\\s+>\\s+\\1\\b)+", "\\1", e$newvar1), "\\d+\\.\\d+"), paste, collapse=" > ")

我收到如下错误的输出

e
Material     newvar1         newvar2
5000        4.28 > 5         4.28
5001        3 > 2 > 3 > 3    3 > 2 > 3

我需要像下面这样

e
Material     newvar1         newvar2
5000        4.28 > 5        4.28 > 5
5001        3 > 2 > 3 > 3    3 > 2 > 3

1 个答案:

答案 0 :(得分:1)

我们可以尝试使用str_replace_all库中的stringr。查找以下模式,然后通过替换为空字符串将其删除:

(\\d+(?:\\.\\d+)?) > (?=\\1)

这会匹配并捕获一个数字,也匹配后跟的>符号。如果向前看,我们会看到相同的数字,然后删除整个前面的数字和>分隔符。

也就是说,3 > 3变成了3

x <- "3 > 2 > 3.28 > 3.28 > 1.5 > 1.5"
str_replace_all(x, "(\\d+(?:\\.\\d+)?) > (?=\\1)", "")

[1] "3 > 2 > 3.28 > 1.5"