替换为仅在某些位置表示日期的字符串

时间:2017-09-01 08:44:35

标签: python string replace

我有一个表示日期的字符串:yymmdd(例如,2017年9月1日为170901),从datetime对象获取。

我想用空格替换每个字段的前导零。 str.replace()不会这样做,因为它也会替换尾随的零。

在字符串中将字符替换为另一个字符的Pythonic方法是什么?但只在某些位置(在这种情况下在字符串的偶数索引中)?

4 个答案:

答案 0 :(得分:2)

你会认为这是优雅的方式吗?

s = '170901'    
res = ''.join([' ' if i%2==0 and x=='0' else x for i, x in enumerate(s)])
print(res)  # 17 9 1

您还可以创建一个功能,以便于使用:

def date_format(date_as_str):
    return ''.join([' ' if i%2==0 and x=='0' else x for i, x in enumerate(date_as_str)])

print(date_format('170901'))  # 17 9 1
print(date_format('170910'))  # 17 910  does not remove the trailing ones..

答案 1 :(得分:2)

转换为datetime对象,然后使用格式将前导空格而不是零应用于仅按月和日:

from datetime import datetime

s = '170901'
s = '{dt:%y}{dt.month:2d}{dt.day:2d}'.format(dt=datetime.strptime(s, '%y%m%d'))
print(s)
#17 9 1

这也确保了无法解析超出天数和月数限制的值,例如42。

datetime对象,您可以轻松切换到您想要的任何格式,或者来回切换初始和后面的字符串:

>>> '{dt:%y}{dt.month:02d}{dt.day:02d}'.format(dt=datetime.strptime(s, '%y%m%d'))
'170901'
>>> '{dt:%y} {dt:%b} {dt.day:2d}'.format(dt=datetime.strptime(s, '%y%m%d')) 
'17 Sep  1'

答案 2 :(得分:1)

这是另一个解决方案,带有一些迭代魔法以避免构建不必要的容器。但请注意我的评论。

>>> from itertools import izip, chain
>>> date = '170901'
>>> ''.join((chain.from_iterable((x if x != '0' else ' ', y) for x,y in izip(*[iter(date)]*2))))
'17 9 1'

答案 3 :(得分:0)

然而,这可能会缩短;您可以尝试使用datetime模块。

import datetime

date_str = "170901"
date = datetime.datetime.strptime(date_str, "%y%m%d")
space_date = ''.join([x.rjust(2) for x in [date.strftime("%y").lstrip('0'), str(date.month), str(date.day)]])

print(space_date) #17 9 1