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

Python 替换为仅在某些位置表示日期的字符串,python,string,replace,Python,String,Replace,我有一个表示日期的字符串,如:yymmdd(例如,2017年9月1日的170901),从datetime对象获取 我想用空格替换每个字段的前导零str.replace()不会这样做,因为它也会替换尾随的零 < P>在字符串中用字符代替另一个字符的Pythic方式是什么,但只在某些位置(在这种情况下,在字符串的偶数索引中)?你会认为这是一种优雅的方式吗?< /P> s = '170901' res = ''.join([' ' if i%2==0 and x=='0' else x for

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

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


< P>在字符串中用字符代替另一个字符的Pythic方式是什么,但只在某些位置(在这种情况下,在字符串的偶数索引中)?

你会认为这是一种优雅的方式吗?< /P>

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..

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

>>> 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'

然而,这可以缩短;您可以尝试使用
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

转换为
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'

你自己说的。偶数索引。。尾随的是奇数。是的,我确实执行了此操作,但我希望看到最好/最优雅的方式。由于
datetime
模块没有提供一种优雅的方式来执行您想要的操作,因此您的请求非常罕见/罕见(因为
datetime
几乎所有操作都与您能想到的日期相关)。因此,请允许我问一个问题:你为什么要这样做,你真的想这样做吗?@timgeb不幸的是,我想。我正在解析使用这种荒谬格式的文件,我无法控制它。是的,这一行适合我的需要:)我会等一天左右,看看我是否能得到一个我更喜欢的答案,或者接受你的答案。我接受了@MosesKoledoye答案,因为它更适合我的具体情况。我也投了你的票,因为这是处理更一般情况的好方法。@user2891462别担心。无论如何,莫斯的方法是更好的方法。到目前为止,这是最好的解决方案
datetime
对象比使用字符串要好得多,这允许您使用日期等进行计算。我一直使用
datetime
直到最后,而
strftime
实际上就是我获得字符串的方式:)我认为这是正确的答案,您想解释一下第一个代码段第三行中的格式设置是如何工作的吗?@user2891462 Python中的新样式字符串格式设置支持datetime对象的格式设置:,并且有属性访问来专门处理某些属性:。把两者结合起来,你就有了一个强大的工具来格式化
datetime
对象。啊,我明白了
dt.month
是一个整数,格式为2个空格,使用
{dt.month:02d}
。这很聪明,谢谢!