【问题标题】:Splitting a string that has a not-space hyphen拆分具有非空格连字符的字符串
【发布时间】:2021-12-12 02:32:31
【问题描述】:
我有如下字符串:
2 - 5-< 2
6 - 10-< 2
6 - 10-2 - 5
> 15-2 - 5
我想在 - 之前或之后都没有空格的地方拆分这些字符串。因此,上面的字符串将按如下方式拆分:
"2 - 5" "< 2"
"6 - 10" "< 2"
"6 - 10" "2 - 5"
"> 15" "2 - 5"
在 R Studio 中,我尝试过使用 sub() 和 strsplit(),但我发现很难设置正确的正则表达式。有人知道吗?
【问题讨论】:
标签:
r
regex
regex-negation
strsplit
【解决方案1】:
将perl=TRUE 与lookaround 一起使用:
vec <- c("2 - 5-< 2", "6 - 10-< 2", "6 - 10-2 - 5", "> 15-2 - 5")
strsplit(vec, "(?<! )-(?!= )", perl=TRUE)
# [[1]]
# [1] "2 - 5" "< 2"
# [[2]]
# [1] "6 - 10" "< 2"
# [[3]]
# [1] "6 - 10" "2 - 5"
# [[4]]
# [1] "> 15" "2 - 5"
【解决方案2】:
我想这是一个更容易理解的解决方案:
library(stringr)
str_split(vec, "(?<=\\d)-(?=\\d)")
[[1]]
[1] "2 - 5" "< 2"
[[2]]
[1] "6 - 10" "< 2"
[[3]]
[1] "6 - 10" "2 - 5"
[[4]]
[1] "> 15" "2 - 5"
首先,不需要perl = TRUE(嗯,但需要一个新包,stringr)。
但是,(?<=\\d) 和 (?=\\d) 是 positive 外观,本质上更容易处理。第一个意思是:如果你看到左边有一个数字……;第二个说,如果你在右边看到一个数字......并且str_split(带有下划线)说,如果这两个条件都满足,那么在破折号上拆分-。