零填充正则表达式取决于数字的长度

时间:2018-10-08 12:23:33

标签: r regex stringr

我有一个包含两个字符,一些数字和一个字母的字段。例如

QU1Y
ZL002
FX16
TD8
BF007P
VV1395
HM18743
JK0001

我想一贯地返回所有字母的原始位置,但数字如下。

1至3位数字: 返回所有数字或用零填充的左数字

4位或更多数字: 它不能以零开头并返回前四位数字;如果前一位为零,则必须截断为三位数

上面数据中的示例

QU001Y
ZL002
FX016
TD008
BF007P
VV1395
HM1874
JK001

实现将在R中进行,但是我对直接的正则表达式解决方案感兴趣,我将解决R方面的问题。直接正则表达式可能无法实现,这就是为什么我无法理解这一点。

这可以标识正确的,但是我希望可以更正那些 是的。

"[A-Z]{2}[1-9]{0,1}[0-9]{1,3}[F,Y,P]{0,1}"

出于好奇,它们是航班号,但由人输入。因此种类繁多...

1 个答案:

答案 0 :(得分:0)

您可以使用

> library(gsubfn)
> l <- c("QU1Y", "ZL002", "FX16", "TD8", "BF007P", "VV1395", "HM18743", "JK0001")
> gsubfn('^[A-Z]{2}\\K0*(\\d{1,4})\\d*', ~ sprintf("%03d",as.numeric(x)), l, perl=TRUE)
[1] "QU001Y" "ZL002"  "FX016"  "TD008"  "BF007P" "VV1395" "HM1874" "JK001" 

模式匹配

  • ^-字符串的开头
  • [A-Z]{2}-两个大写字母
  • \\K-到目前为止匹配的文本已从匹配项中删除
  • 0*-0或多个零
  • (\\d{1,4})-捕获第1组:一到四位数
  • \\d*-0多个数字。

第1组传递到回调函数,其中sprintf("%03d",as.numeric(x))用必要的数字填充值。