RegEx: пропустить первый одиночный ноль в номерах рейсов

Мне нужен RegEx для форматирования номеров рейсов, чтобы сохранить буквенный код и следующие цифры, но опустить начальный ноль, если он стоит один, а общее количество цифр не менее четырех. Это используется в ярлыках iOS , которые представляют собой упрощенный рабочий процесс с действиями. Я могу использовать действие сопоставления с RegEx. Примеры желаемых результатов:

SK0498 должен вернуть SK498 (всего цифр = 4 = опустить один ведущий ноль)

AA007 по-прежнему должен возвращать AA007 (поскольку ведущие нули двойные, а общее количество цифр равно только 3)

UA2138 возвращает UA2138 (без ведущих нулей)

BA023 должен возвращать BA023 (сохранять ноль, поскольку общее количество цифр составляет всего 3), однако BA0234 должен возвращать BA234 (общее количество цифр равно 4 с одним ведущим нулем, который следует опустить).

Я не очень хорошо разбираюсь в RedEx, но пока разобрался(?=0*)(00)*([1-9][\d]*). Это правильно пропускает первый ноль, если он не двойной, но я только на полпути. Я также хочу, чтобы он возвращал буквенный код, а также соблюдал правило минимума из 4 цифр для пропуска начального нуля. (Если строка состоит из 4 цифр с одним ведущим нулем, опустите первую цифру, в противном случае сохраните ее). Если это вообще возможно с таким количеством критериев, как это должно выглядеть?

2 ответа

Если вы хотите опустить первый одиночный ноль, вы можете использовать группу захвата для ведущих символов верхнего регистра и использовать эту группу при замене:

      \b([A-Z]+)0(?=[1-9]\d{2}\b)

Узор соответствует:

  • \bГраница слова для предотвращения частичного совпадения слов
  • ([A-Z]+)Захватить группу 1 , сопоставить 1+ символов от AZ
  • 0Сопоставить ноль (если вы хотите сопоставить 1 или более нулей, тогда0+)
  • (?=[1-9]\d{2}\b)Позитивный просмотр вперед, утверждает цифру 1–9, за которой следуют 2 цифры и граница слова (всего 4 последовательные цифры)

Демо регулярного выражения

Если существует правило минимума из 4 цифр, вы можете опустить границу последнего слова и указать как минимум 2 цифры:

      \b([A-Z]+)0(?=[1-9]\d{2})

Если справа от ведущего нуля может быть 3 цифры, и вы хотите удалить только первый ноль:

      \b([A-Z]+)0(?=\d{3}\b)

Демо регулярного выражения

Вы также можете попытаться найти буквы, а затем последние три цифры объединить их вместе следующим образом:

      import re

for s in ['BA023', 'BA0432', 'BA0007']:
  numbers = re.findall('\d+', s)[0][-3:]
  alpha = re.findall('[a-zA-Z]+', s)[0]
  print(alpha+numbers, s)
Другие вопросы по тегам