如果后面跟一个字符,则REGEX下降到前导零

时间:2019-12-17 09:29:24

标签: r regex gsub

我正在尝试格式化data.frame中的某些字符串,并且仅当第二个字符是字母时,我想删除前导零:

3818119 --> 3818119

0M11936 --> M11936

0X11087 --> X11087

0T05060 --> T05060

到目前为止,我已经尝试了几种方法,最后一种gsub("^(?=[^A-Z]{2})","" ,output$id)gsub("/^..[a-z]/","" ,output$id),但都没有成功。

2 个答案:

答案 0 :(得分:7)

您可以使用

sub("^0([[:alpha:]])", "\\1" ,output$id)

模式匹配

  • ^-字符串的开头
  • 0-零
  • ([[:alpha:]])-第1组(\1):一封信

如果只考虑大写ASCII字母,请使用

sub("^0([A-Z])", "\\1" ,output$id)

您尝试编写的环视版本需要使用perl=TRUE启用的PCRE引擎:

sub("^0(?=[A-Z])", "", output$id, perl=TRUE)

R demo

x <- c("3818119", "0M11936", "0X11087", "0T05060")
sub("^0([[:alpha:]])", "\\1", x)
sub("^0([A-Z])", "\\1", x)
sub("^0(?=[A-Z])", "", x, perl=TRUE)

注意。如果开头有多个0个字符,请在+之后添加0

答案 1 :(得分:0)

假设您还想删除字符串中的多个前导零,那么也许您可以尝试下面的代码

gsub("^0+([[:alpha:]].*)","\\1",s)

如此

> gsub("^0+([[:alpha:]].*)","\\1",s)
[1] "M11936" "M11936" "M11936" "01111"

数据

s <- c("M11936","0M11936","00M11936","01111")