我正在尝试扩展当前以短划线分隔的数字范围,以包括所有数字。
好消息是,我找到了有助于以下配置的代码(不是我的):
“舞厅1-3”产生了“舞厅1,舞厅2,舞厅3”,这是我想要的。问题在于,这要以破折号前后没有空格为条件。当前,“ Ballroom 1-3”返回“ Ballroom 1-3,Ballroom 1-3,Ballroom 1-3”;这不是所需的输出。
请注意,由于多种原因,必须保留破折号前后的空格。 “宴会厅1-3”的输入必须保持不变。
## Dealing with Dash Seperated Sequences of Numbers
expand.dash <- function(dashed) {
limits <- as.numeric(unlist(strsplit(dashed, '-')))
seq(limits[1], limits[2])
}
expand.ballrooms <- function(txt) {
str <- gsub('\\d+-\\d+', '%d', txt)
dashed_str <- gsub('[a-zA-Z ]+', '', txt)
sprintf(str, expand.dash(dashed_str))
}
expand.ballrooms("Ballroom 1-3")
# this works but the line below fails to output the desired result
expand.ballrooms("Ballroom 1 - 3")
# Result should be identical to the the output returned by the previous line.
虽然没有错误消息弹出,但破折号前后的空格会导致输出重复。
答案 0 :(得分:3)
在expand.ballrooms
中更改
gsub('\\d+-\\d+', '%d', txt)
对此:
gsub('\\d+\\s*-\\s*\\d+', '%d', txt)
答案 1 :(得分:0)
您可以在函数gsub
的{{1}}中的模式中添加可选的空格
expand.ballrooms
修改后的功能将是
gsub('\\d+\\s?-\\s?\\d+', '%d', txt)
现在这对两种情况都适用
expand.dash <- function(dashed) {
limits <- as.numeric(unlist(strsplit(dashed, '-')))
seq(limits[1], limits[2])
}
expand.ballrooms <- function(txt) {
str <- gsub('\\d+\\s?-\\s?\\d+', '%d', txt)
dashed_str <- gsub('[a-zA-Z ]+', '', txt)
sprintf(str, expand.dash(dashed_str))
}