我有一个字段,其中包含两个查里特,一些数字和可能只有一个字母。例如
QU1Y
ZL002
FX16
TD8
BF007P
VV1395
HM18743
JK0001
我想始终如一地将所有字母返回其原始位置,但数字如下。
对于 1 到 3 位数字: 返回所有数字或用零填充的数字
对于 4 位或更多数字: 它不能以零开头并返回前 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}"
对于好奇的人来说,它们是航班号,但由人类输入。因此品种...
您可以使用
> 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:1 到 4 位数字\d*
- 0+ 位数字。
组 1 传递给回调函数,其中sprintf("%03d",as.numeric(x))
用必要的数字填充值。