регулярное выражение заполнения нулями в зависимости от длины цифр - PullRequest
0 голосов
/ 08 октября 2018

У меня есть поле, которое содержит две буквы, несколько цифр и, возможно, одну букву.Например,

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}"

Для любопытных это номера полетов, но введенные человеком.Отсюда и разнообразие ...

1 Ответ

0 голосов
/ 08 октября 2018

Вы можете использовать

> 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)) дополняет значение необходимым количеством цифр.

...