Как извлечь вложенную строку между двумя символами?

#python #list #search #substring

#python #Список #Поиск #подстрока

Вопрос:

Я хочу извлечь все даты внутри my_list

 my_list = ['FRE_5F_20200915-08u21m57s_ab', 'AY_C7_20200813-17u02m16s_ab', 'ALL_20200915-06u34m05s_ab', 'FF_20200816-11u21m44s_ab']
  

Это мой код:

 for file in my_list:
    find = re.search('_(. ?)-', file).group(1)
    print(find)
  

Это вывод:

 5F_20200915
C7_20200813
20200915
20200816
  

Это мой ожидаемый результат:

 20200915
20200813
20200915
20200816
  

Комментарии:

1. _(. ?)- точка будет соответствовать чему угодно. Вам просто нужны цифры. Вы получаете 5F_20200915, потому что возвращается самая длинная строка с маршем. Самым коротким совпадением будет 20200915.

2. Верно, только что узнал, да. Спасибо

Ответ №1:

Вы можете использовать _(d )- Regex101:

 import re


my_list = ['FRE_5F_20200915-08u21m57s_ab', 'AY_C7_20200813-17u02m16s_ab', 'ALL_20200915-06u34m05s_ab', 'FF_20200816-11u21m44s_ab']
r = re.compile(r'_(d )-')

for s in my_list:
    m = r.search(s)
    if m:
        print(m.group(1))
  

С принтами:

 20200915
20200813
20200915
20200816
  

Комментарии:

1. Спасибо, кажется, работает, можете ли вы сказать мне, что именно вы сделали?

2. @NorthAfrican _(d )- Шаблон будет искать все цифры (0-9) между символами _ и - . Смотрите здесь regex101.com/r/JHweC1/1

3. Ах, хорошо, это работает идеально, однако я думаю, что ответ goldwave немного проще!

Ответ №2:

Исправлено ваше регулярное выражение, ваш вывод соответствует вашему регулярному выражению. Чтобы сопоставлять только числа между _ и - , вы можете использовать '_(d )-' , как показано ниже

 import re
my_list = ['FRE_5F_20200915-08u21m57s_ab', 'AY_C7_20200813-17u02m16s_ab', 'ALL_20200915-06u34m05s_ab', 'FF_20200816-11u21m44s_ab']
for file in my_list:
    find = re.search('_(d )-', file).group(1)
    print(find)
  

Что приводит к

 20200915
20200813
20200915
20200816
  

Ответ №3:

Это можно сделать без регулярного выражения:

 for s in my_list:

    # find the index of -
    index = s.index("-")

    # extract 8 characters before that
    print(s[index-8:index])