我在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')
答案 0 :(得分:2)
如果您只想从头开始匹配整个字符串,包括2个日期,则无需使用捕获组。
您可以匹配2个下划线和一个数字,然后从匹配1+倍还匹配下划线的单词字符\w+
的字符串的开头开始匹配。
^\w+_\d{8}_\d{8}
例如:
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