如何使用 R 从字符串中间删除两位数字(01、02 等)的前导零?
How can I remove leading zeros for two digits number (01, 02, etc.) from the middle of character string using R?
对于下面的字符串向量s
,我希望去掉每个元素中的前导零,这与的答案相反:
s <- c('week 01st', 'weeks 02nd', 'year2022week01st', 'week 4th')
预期的结果是:
s <- c('week 1st', 'weeks 2nd', 'year2022week1st', 'week 4th')
我测试了以下代码,由于正则表达式语法不完整,所以无法运行:
s <- 'week 01st'
sub('^0+(?=[1-9])', '', s, perl=TRUE)
sub('^0+([1-9])', '\1', s)
输出:
[1] "week 01st"
我如何使用 R 来做到这一点?
更新: @dvantwisk 贡献的以下代码,适用于year2022week01st
,但不适用于其他元素:
s <- c('week 01st', 'weeks 02nd', 'year2022week01st', 'week 4th')
gsub('(year[0-9]{4,})(week)(0{0,})([1-9]{1})([0-9a-zA-Z]{1,})', '\1\2\4\5', s)
输出:
[1] "week 01st" "weeks 02nd" "year2022week1st" "week 4th"
gsub('(week )(0{0,})([1-9]{1})([0-9a-zA-Z]{1,})', '\1\3\4', week_string)
gsub()
将三个参数作为输入:模式、替换和查询字符向量。我们的策略是创建一个包含四个组的正则表达式 ()
s.
我们拳打脚踢'week '.
然后我们用表达式 (0{0,})
匹配零个或多个零。第一个零表示我们试图匹配的字符,表达式 {0,}
表示我们试图匹配零次(因此是 0)或更多次(因此是逗号)。
我们的第三组匹配 1 到 9 之间的任意数字一次。
第四组是匹配 0 到 9 之间的任何数字或任何字母 1 次或更多次
我们的替补是'\1\3\4'
。这表明我们只想在结果中保留第一组和第三组。因此输出是:
[1] "week 1st" "week 2nd" "week 3rd" "week 4th"
您可能会使用:
weeks?\h*\K0+(?=[1-9]\d*[a-zA-Z])
模式匹配:
weeks?
比赛周可选 s
\h*\K
匹配可选空格,忘记到目前为止匹配的是什么
0+
匹配 1+ 次零
(?=[1-9]\d*[a-zA-Z])
正面前瞻,断言字符 1-9、可选数字和右侧的字符 a-zA-Z
看到一个Regex demo and a R demo。
在替换中使用空字符串。
例如
s <- c('week 01st', 'weeks 02nd', 'year2022week01st', 'week 4th')
gsub("weeks?\h*\K0+(?=[1-9]\d*[a-zA-Z])", '', s, perl=T)
输出
[1] "week 1st" "weeks 2nd" "year2022week1st" "week 4th"
或使用 2 个捕获组:
(weeks?\h*)0+([1-9]\d*[a-zA-Z])
示例:
s <- c('week 01st', 'weeks 02nd', 'year2022week01st', 'week 4th')
gsub("(weeks?\h*)0+([1-9]\d*[a-zA-Z])", '\1\2', s,)
输出
[1] "week 01st" "weeks 02nd" "year2022week1st" "week 4th"
对于下面的字符串向量s
,我希望去掉每个元素中的前导零,这与
s <- c('week 01st', 'weeks 02nd', 'year2022week01st', 'week 4th')
预期的结果是:
s <- c('week 1st', 'weeks 2nd', 'year2022week1st', 'week 4th')
我测试了以下代码,由于正则表达式语法不完整,所以无法运行:
s <- 'week 01st'
sub('^0+(?=[1-9])', '', s, perl=TRUE)
sub('^0+([1-9])', '\1', s)
输出:
[1] "week 01st"
我如何使用 R 来做到这一点?
更新: @dvantwisk 贡献的以下代码,适用于year2022week01st
,但不适用于其他元素:
s <- c('week 01st', 'weeks 02nd', 'year2022week01st', 'week 4th')
gsub('(year[0-9]{4,})(week)(0{0,})([1-9]{1})([0-9a-zA-Z]{1,})', '\1\2\4\5', s)
输出:
[1] "week 01st" "weeks 02nd" "year2022week1st" "week 4th"
gsub('(week )(0{0,})([1-9]{1})([0-9a-zA-Z]{1,})', '\1\3\4', week_string)
gsub()
将三个参数作为输入:模式、替换和查询字符向量。我们的策略是创建一个包含四个组的正则表达式 ()
s.
我们拳打脚踢'week '.
然后我们用表达式 (0{0,})
匹配零个或多个零。第一个零表示我们试图匹配的字符,表达式 {0,}
表示我们试图匹配零次(因此是 0)或更多次(因此是逗号)。
我们的第三组匹配 1 到 9 之间的任意数字一次。
第四组是匹配 0 到 9 之间的任何数字或任何字母 1 次或更多次
我们的替补是'\1\3\4'
。这表明我们只想在结果中保留第一组和第三组。因此输出是:
[1] "week 1st" "week 2nd" "week 3rd" "week 4th"
您可能会使用:
weeks?\h*\K0+(?=[1-9]\d*[a-zA-Z])
模式匹配:
weeks?
比赛周可选 s\h*\K
匹配可选空格,忘记到目前为止匹配的是什么0+
匹配 1+ 次零(?=[1-9]\d*[a-zA-Z])
正面前瞻,断言字符 1-9、可选数字和右侧的字符 a-zA-Z
看到一个Regex demo and a R demo。
在替换中使用空字符串。
例如
s <- c('week 01st', 'weeks 02nd', 'year2022week01st', 'week 4th')
gsub("weeks?\h*\K0+(?=[1-9]\d*[a-zA-Z])", '', s, perl=T)
输出
[1] "week 1st" "weeks 2nd" "year2022week1st" "week 4th"
或使用 2 个捕获组:
(weeks?\h*)0+([1-9]\d*[a-zA-Z])
示例:
s <- c('week 01st', 'weeks 02nd', 'year2022week01st', 'week 4th')
gsub("(weeks?\h*)0+([1-9]\d*[a-zA-Z])", '\1\2', s,)
输出
[1] "week 01st" "weeks 02nd" "year2022week1st" "week 4th"