Регулярное выражение, которое не соответствует 0 в начале для каждой группы

  1. 01 Ded.PASIVIC 05-01-2016.xlsx
  2. 01 Ded.PASIVIC 15-01-2016.xlsx
  3. 01 Ded.PASIVIC 10-01-2016.xlsx
  4. 06 DED. PASIVIC 30-03-2016 (1).xlsx
  5. 19 DEDUCCION PASIVIC DEL 15-10-2016.xlsx (2)
  6. 23 DEDUCCION PASIVIC DEL 15-12-2016.xlsx (1)
  7. 18 APORTE PASIVIC DEL 30-09-2016.xlsx

Я хотел бы получить дату, которая напечатана на названии файлов выше, но без начальных нулей. введите описание изображения здесь

Вместо того, чтобы получить всю дату, как я делаю выше, я хочу получить для первого файла 5-1-2016, для второго файла я хочу 15-1-2016, для третьего 10-1-2016 и так далее (Нет ведущих нулей).

Ожидаемый результат должен быть таким:

  1. 5-1-2016
  2. 15-1-2016
  3. 10-1-2016
  4. 30-3-2016
  5. 15-10-2016
  6. 15-12-2016
  7. 30-9-2016

Я делаю это на питоне.

3 ответа

Решение

Можно сопоставить 3 группы, а для первых 2 групп - необязательный ноль с последующим захватом 1 или 2 раза цифры 0?([0-9]{1,2}-) сопровождаемый чертой.

Вы можете добавить границу слова \b в начале и в конце.

^.*?\b0?([0-9]{1,2}-)0?([0-9]{1,2}-)([0-9]{4})\b.*$

Тогда вы можете использовать sub и в замене использовать группы захвата:

\1\2\3

import re
regex = r"^.*?\b0?([0-9]{1,2}-)0?([0-9]{1,2}-)([0-9]{4})\b.*$"
test_str = "01 Ded.PASIVIC 05-01-2016.xlsx"
subst = r"\1\2\3"
result = re.sub(regex, subst, test_str, 1)

if result:
    print (result) # 5-1-2016

демонстрация

Самым примитивным способом я бы пошел с этим решением:

([1-9]) ([0-9]) - ([0-9] +) - ([0-9] +) | ([0-9]) - ([0-9] +) - ([0-9] +)

Вы можете сделать это в два этапа с re.findall а также re.sub:

import re

data = """
01 Ded.PASIVIC 05-01-2016.xlsx 
01 Ded.PASIVIC 15-01-2016.xlsx 
01 Ded.PASIVIC 10-01-2016.xlsx 
06 DED. PASIVIC 30-03-2016 (1).xlsx 
19 DEDUCCION PASIVIC DEL 15-10-2016.xlsx (2) 
23 DEDUCCION PASIVIC DEL 15-12-2016.xlsx (1) 
18 APORTE PASIVIC DEL 30-09-2016.xlsx
"""

matches = re.findall('(?:[0-9]{2}-){2}[0-9]{4}',data)
print(re.sub('0(?=[0-9]-)','',str(matches)))

Печать:

['5-1-2016', '15-1-2016', '10-1-2016', '30-3-2016', '15-10-2016', '15-12-2016', '30-9-2016']
Другие вопросы по тегам