咨询datetime.strptime是否支持忽略额外字符的格式指令及多格式解析方案
关于datetime.strptime处理末尾无关字符的问题
嘿,这个问题我之前处理过类似的场景,刚好能给你唠唠~
首先明确说:datetime.strptime的format参数并不支持正则表达式语法,它是基于预定义的格式化指令(比如%Y、%m)来匹配固定位置的字符,没法像正则那样写.*这类通配符来忽略任意字符。
不过!它有个非常实用的特性刚好能解决你的需求:只要输入字符串的前缀部分和format完全匹配,后面的多余字符会被自动忽略。举个你的例子:
你的目标字符串是2016423123,其中前7位是有效日期(2016年4月23日),末尾123是无关内容。你只需要构造出匹配有效前缀的format,strptime会自动无视后面的字符。
针对你的日期结构(4位年+1位月+2位日),可以用这个format:
from datetime import datetime # 注意:%-m 是无填充的月份(支持1-12,一位或两位都可以),这个指令在类Unix系统下有效,Windows系统可能需要用%#m dt = datetime.strptime("2016423123", "%Y%-m%d") print(dt) # 输出:2016-04-23 00:00:00
如果你的系统不支持%-m(比如Windows),也可以结合你提到的try/catch方案,把所有可能的格式都列出来循环尝试:
from datetime import datetime def parse_custom_datetime(s): # 列出所有可能的有效格式,覆盖你遇到的多种情况 possible_formats = [ "%Y%-m%d", # 4位年+1位月+2位日 "%Y%m%d", # 4位年+2位月+2位日 "%Y%b%d", # 比如2016Apr23xxx这种带月份缩写的格式 # 继续添加其他你需要支持的格式 ] for fmt in possible_formats: try: return datetime.strptime(s, fmt) except ValueError: # 格式不匹配,继续尝试下一个 continue # 所有格式都试完了还是不行,抛出异常 raise ValueError(f"无法解析日期字符串: {s}")
补充一句:如果无关字符不是在末尾,而是穿插在有效日期中间,那strptime就没办法直接处理了,这时候可能还是需要先用正则提取出有效部分再解析,但如果只是末尾的无关内容,上面的方法完全够用。
内容的提问来源于stack exchange,提问作者Lev
相关产品推荐
相关产品推荐

