删除最后一次出现分隔符后的字符-但在开头出现一次分隔符时保留字符

时间:2020-05-27 14:12:42

标签: r regex

对不起,标题很尴尬-非常欢迎提出建议,以更好地表述它...

这与Question 1Question 2question 3非常相似。所有这些问题都有一个解决方案,该解决方案将在分隔符(通常是下划线)出现“每最后一次”之后删除,包括在字符串的开头出现时。

我需要将那些在分隔符仅出现一次的字符串保留在字符串的开头。

在示例中,对于x[3]x[5],我想保留“ -3”和“ -5”。我的第一次尝试保持-5,但不保持-3 ...

x <- c("1 - 2","2-1", "-3", "4", "-5-6")

gsub("(.*)\\-.*$", "\\1", x)
#> [1] "1 " "2"  ""   "4"  "-5"

gsub("\\-[^\\-].*$", "", x)
#> [1] "1 " "2"  ""   "4"  ""

修改 Ronaks当前解决方案适用于前面的示例,但是在定界符之前或之后,除了数字以外的其他字符都失败。

x <- c("1 - 2","2-1", "-3", "4", "-5-6", "-0.6", "20/200", "20/200-3")

stringr::str_match(x, '(-?\\d+)-?')[, 2]
#> [1] "1"  "2"  "-3" "4"  "-5" "-0" "20" "20"

所需的输出

#> [1] "1"  "2"  "-3" "4"  "-5" "-0.6" "20/200" "20/200"

(出于好奇:这是用于转换视敏度数据的表示法的,它告诉我们如何区分图表上的字母。此数据有时可能非常混乱,但通常遵循某种表示法。)

2 个答案:

答案 0 :(得分:2)

这似乎可以满足您的要求:

str_extract(x, "(-)?\\d+[.\\d/]*(?=-?)")
[1] "1"      "2"      "-3"     "4"      "-5"     "-0.6"   "20/200" "20/200"

这将匹配一个可选的-,后跟一个或多个数字,然后是.或一个数字或/零次或多次(*) ({(?= ...))左侧的可选-

编辑

base R解决方案是这样:

unlist(regmatches(x, gregexpr("^(-)?\\d+[.\\d/]*(?=-?)", x, perl = T)))
[1] "1"      "2"      "-3"     "4"      "-5"     "-0.6"   "20/200" "20/200"

数据:

x <- c("1 - 2","2-1", "-3", "4", "-5-6", "-0.6", "20/200", "20/200-3")

答案 1 :(得分:1)

使用str_match

stringr::str_match(x, '(-?\\d+)-?')[, 2]
#[1] "1"  "2"  "-3" "4"  "-5"

这将捕获一个可选的"-",后跟一个数字,然后是另一个可选的"-"


使用str_extract

stringr::str_extract(x, '-?\\d+(?=-?)')

并在基数R中:

sub("(-?\\d+)-?.*", "\\1", x)