Извлечь строку с датой в Python - PullRequest
0 голосов
/ 13 мая 2019

У меня есть список строк в Python 2.7, как это:

lst = [u'Name1_Cap23_o2_A_20160830_20170831_test.tif', 
    u'Name0_Cap44_o6_B_20150907_20170707.tif',
    u'Name99_Vlog_o88_A_20180101_20180305_exten.tif']

Что я хотел бы сделать, это извлечь только строку перед двумя датами, чтобы я получил список, подобный этому:

lst = [u'Name1_Cap23_o2_A_20160830_20170831', 
    u'Name0_Cap44_o6_B_20150907_20170707',
    u'Name99_Vlog_o88_A_20180101_20180305']

Что я знаю, так это как извлечь две даты с помощью re package, но как я могу получить список в примере выше, используя datetime и re package. У кого-нибудь есть идеи, как я могу получить оставшуюся часть строки?

from datetime import datetime
import re
from datetime import datetime
pattern = re.compile(r'(\d{8})_(\d{8})')
dates = pattern.search(lst[0])
startdate = datetime.strptime(dates.group(1), '%Y%m%d')
enddate = datetime.strptime(dates.group(2), '%Y%m%d')
datestring = format(startdate, '%Y%m%d') + "_" + format(startdate, '%Y%m%d')

Ответы [ 2 ]

2 голосов
/ 13 мая 2019

Если вы хотите сопоставить только всю строку с самого начала, включая 2 даты, вам не нужно использовать группу захвата.

Вы можете сопоставить 2 знака подчеркивания и цифры и начать сопоставлениеот начала строки, совпадающей 1+ раз с символом слова \w+, который также соответствует подчеркиванию.

^\w+_\d{8}_\d{8}

Regex demo | Python demo

Например:

lst = [u'Name1_Cap23_o2_A_20160830_20170831_test.tif',
       u'Name0_Cap44_o6_B_20150907_20170707.tif',
       u'Name99_Vlog_o88_A_20180101_20180305_exten.tif']

pattern = re.compile(r'^\w+_\d{8}_\d{8}')
pattern_list=map(lambda x: pattern.search(x).group(), lst)
print(pattern_list)

Результат

[u'Name1_Cap23_o2_A_20160830_20170831', u'Name0_Cap44_o6_B_20150907_20170707', u'Name99_Vlog_o88_A_20180101_20180305']
1 голос
/ 13 мая 2019

Ваше регулярное выражение было почти правильным.Я обновил ваше регулярное выражение с (\d{8})_(\d{8}) до (.+\d{8})_(\d{8}).Добавленное значение .+ соответствует любому символу по крайней мере 1 или более раз.

from datetime import datetime
import re

lst = [u'Name1_Cap23_o2_A_20160830_20170831_test.tif',
u'Name0_Cap44_o6_B_20150907_20170707.tif',
u'Name99_Vlog_o88_A_20180101_20180305_exten.tif']

# modify list
for i in range(len(lst)):
  # retrieve full name with date
  new_name_pattern = re.compile(r'(.+\d{8})_(\d{8})')
  new_name = new_name_pattern.search(lst[i])

  # replace current processed string
  lst[i] = new_name.group(1)

# print new list
for i in range(len(lst)):
  print lst[i]

Пример можно найти здесь: https://repl.it/repls/InternalOrchidVisitors

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...