我有一个包含两个字符,一些数字和一个字母的字段。例如
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}"
出于好奇,它们是航班号,但由人输入。因此种类繁多...
答案 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))
用必要的数字填充值。