在Python中提取带有日期的字符串

时间:2019-05-13 13:07:35

标签: regex string python-2.7

我在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包提取两个日期,但是如何在上面的示例中使用datetime和re包获取列表。有谁知道我如何获得其余的字符串?

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 个答案:

答案 0 :(得分:2)

如果您只想从头开始匹配整个字符串,包括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 :(得分:1)

您的正则表达式几乎是正确的。我已将您的正则表达式从(\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