R 正则表达式如果后跟字符,则删除前导零

R 正则表达式如果后跟字符,则删除前导零,r,regex,gsub,R,Regex,Gsub,我正在尝试格式化data.frame中的一些字符串,并且仅当且仅当第二个字符是字母时,我希望删除前导零: 3818119->3818119 0M11936->M11936 0X11087->X11087 0T005060->T05060 到目前为止,我已经尝试了几种方法,last gsub^?=[^A-Z]{2},output$id和gsub/^..[A-Z]/,output$id,但都没有成功。您可以使用 sub("^0([[:alpha:]])", "\\1" ,output$id) 模式

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

3818119->3818119

0M11936->M11936

0X11087->X11087

0T005060->T05060

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

您可以使用

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

^-字符串的开头 零-零 [:alpha:][]-第1组\1:字母

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

sub("^0([A-Z])", "\\1" ,output$id)
您试图编写的环顾版本需要使用perl=TRUE启用的PCRE引擎:

:

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

您可以使用

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

^-字符串的开头 零-零 [:alpha:][]-第1组\1:字母

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

sub("^0([A-Z])", "\\1" ,output$id)
您试图编写的环顾版本需要使用perl=TRUE启用的PCRE引擎:

:


注意:如果开始处有多个0字符,请在0后面添加+。

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

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

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


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

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

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


非常好的回答和解释,非常感谢!我离答案不远@sanna请注意我答案底部的注释。我决定将此添加为注释,而不是主要答案,因为仅当第二个字符是字母时才需要此要求。但是,如果第二个表示所有前导零之后的内容,则需要在零之后添加+。是的,我注意到了!哲谷@sanna Bardzo proszę:很好的回答和解释,非常感谢!我离答案不远@sanna请注意我答案底部的注释。我决定将此添加为注释,而不是主要答案,因为仅当第二个字符是字母时才需要此要求。但是,如果第二个表示所有前导零之后的内容,则需要在零之后添加+。是的,我注意到了!哲谷@sanna Bardzo proszę:你为什么使用alnum?OP提到,当且仅当第二个字符是字母时,他们希望删除前导0。如果您有01111这样的字符串,这也将删除0。@RonakShah感谢您的提醒!我没有注意到当且仅当第二个字符是字母时。代码已更新为什么要使用alnum?OP提到,当且仅当第二个字符是字母时,他们希望删除前导0。如果您有01111这样的字符串,这也将删除0。@RonakShah感谢您的提醒!我没有注意到当且仅当第二个字符是字母时。代码已更新