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

标签 r regex stringr

我有一个包含两个字符、一些数字和可能是一个字母的字段。例如

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 组:一到四位数字
  • \\d* - 0+ 位。

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

关于r - 取决于数字长度的零填充正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52702226/

相关文章:

r - R中的州级失业率

javascript西里尔正则表达式

javascript - 删除多个标点符号后面的标点符号javascript

r - 如何使用 stringr 从字符串中提取多个重叠的字符串?

R 从 str_split 获取最后一个元素

r - 如何从 R 字符串中的多个列表中检测子字符串

r - 查找每个组的最大值并返回另一列

r - 使用相同的列填充另一个数据框中的缺失值

r - 如何列出我的全局环境中的所有数据框?

c - memcpy regex_t 安全吗?