python无效的类字符串_Python不规范的日期字符串处理类
我分析了形如19920203、199203、1992.02.03、1992.02、1992-02-03、1992-02、920203时间格式特征,列出了正则表达式如下:
^((?:19|20)?\d{2})[-.]?((?:[0-1]?|1)[0-9])[-.]?((?:[0-3]?|[1-3])[0-9])?$
当然这个表达式还不是很完善,只能做简单的切割,不能判断日期的合法性,关于日期是否合法,我还是交给Python的时间功能来处理吧。
根据上面的正则表达式,我写的DateParser类如下:
import re
import datetime
# ***************************************************
# *
# * Description: 非标准的日期字符串处理
# * Author: wangye
# *
# ***************************************************
class DateParser(object):
def __init__(self):
self.pattern = re.compile(
r'^((?:19|20)?\d{2})[-.]?((?:[0-1]?|1)[0-9])[-.]?((?:[0-3]?|[1-3])[0-9])?$'
)
def __cutDate(self, date, flags):
y = date.year
m = date.month if flags[1] else 1
d = date.day if flags[2] else 1
return datetime.date(y, m, d)
def __mergeFlags(self, flags1, flags2):
l = []
length = min(len(flags1), len(flags2))
for i in range(0, length):
if flags1[i] and flags2[i]:
l.append(True)
else:
l.append(False)
return l
def parse(self, strdate):
"""
描述:时间解析方法。
参数:strdate 要分析的时间字符串,比如目标时间类型datetime(1992, 2, 3)
可以被解析的是下述字符串之一:
19920203
199203
1992.02.03
1992.02
1992-02-03
1992-02
920203
返回值:
如果成功
元组(datetime, flags),其中datetime表示转换完成的合法时间,
flags是标志位,表示有效位数,比如199202实际转换了年和月,日没有,
但是本函数将默认返回1日,但是flags将表示为(True, True, False),
前面两个True分别表示年和月被转换,最后一个False表示日没有被转换。
如果失败
返回None。
"""
m = self.pattern.match(strdate)
flags = [False, False, False]
if m:
matches = list(m.groups())
flags = list(map(lambda x:True if x!=None else False, matches))
results = list(map(lambda x:int(x) if x!=None else 1, matches))
# results = list(map(lambda x:1 if x==None else x, results))
if results[0]<100:
if results[0]>9:
results[0] += 1900
else:
results[0] += 2000
return (datetime.date(results[0], results[1], results[2]), flags)
else:
return None
def convert(self, strdate, format):
"""
描述:转换日期为指定格式。
参数:strdate 同parse方法的strdate参数。
format Python时间格式标识,同datetime.date.strftime格式化标识。
返回值:
如果成功,返回指定format格式的时间字符串。
如果失败,返回None。
"""
date = self.parse(strdate)
if date:
date = date[0]
return datetime.date.strftime(date, format)
else:
return None
def compare(self, strdate1, strdate2):
"""
描述:比较两个日期。
参数:strdate1 和 strdate2 同parse方法的strdate参数
返回值:
可以是下列值之一
-4 strdate1 无效, strdate2 有效
-3 strdate1 有效, strdate2 无效
-2 strdate1 和 strdate2 无效
-1 strdate1 < strdate2
0 strdate1 = strdate2
1 strdate1 > strdate2
"""
date1,flags1 = self.parse(strdate1)
date2,flags2 = self.parse(strdate2)
if date1 == None and date2 != None:
return -4
if date1 != None and date2 == None:
return -3
elif date1 == None and date2 == None:
return -2
flags = self.__mergeFlags(flags1, flags2)
date1 = self.__cutDate(date1, flags)
date2 = self.__cutDate(date2, flags)
if date1>date2:
return 1
elif date1
return -1
else:
return 0
下面举几个例子供大家参考:
>>> DateParser().parse("19860126")
(datetime.date(1986, 1, 26), [True, True, True])
>>> DateParser().parse("199111")
(datetime.date(1991, 11, 1), [True, True, False])
>>> DateParser().parse("1991")
(datetime.date(1919, 9, 1), [True, True, True])
>>> DateParser().parse("8511")
(datetime.date(1985, 11, 1), [True, True, False])
>>> DateParser().convert("19911101", "%Y * %m * %d")
'1991 * 11 * 01'
>>> DateParser().convert("1990.1.01", "%Y.%m.%d")
'1990.01.01'
>>> DateParser().compare("1992.2", "19922")
0
>>> DateParser().compare("1992.2", "1956.03.1")
1
python无效的类字符串_Python不规范的日期字符串处理类相关推荐
- MySQL中字符串比较大小(日期字符串比较问题)
MySQL中字符串比较大小(日期字符串比较问题) 数据库中在对于数字与非数字混合的字符串,在进行大小比较的时候,如果两字符串长度相等,那么两字符串就会比较相同位置的字符,比较时若字符是数字,则直接比较 ...
- python公共基础知识整理_python基础知识整理——字符串
1.字符串的基本操作 所有标准的序列操作(索引.分片.乘法.判断成员的资格.求长度.取最大值和最小值)都适用于字符串. Python 字符串 字符串是 Python 中最常用的数据类型.我们可以使用引 ...
- python规范化字符串_python中正确的字符串编码规范
在Python中字符串是不可改变的对象(immutable),因此无法直接修改字符串的某一位字符.一种可行的方式,是将字符串转换为列表,修改列表的元素后,在重新连接为字符串. 示例代码如下:s = ' ...
- python stringstrip方法详解_Python 基础知识全篇-字符串(Strings)
字符串是字符的集合. 单引号和双引号 字符串可以包含在单引号或双引号中. my_string = "This is a double-quoted string." my_stri ...
- python中星号数字乘字符串_Python系列-数字和字符串
数字 Python的数学计算功能强大而简单,可以计算各种复杂的运算.数字分整型(integer)和浮点型(float),即整数和小数.这一节中,介绍的是简单的数字运算. 先来看一段代码: >&g ...
- python中用什么函数读取字符串_Python(2)字符串的主要方法
二.字符串方法 1. 获取字符串的长度,使用函数len() 1 a = "Hello, World!" 2 print(len(a)) 2. 删除字符串前后空格,使用函数strip ...
- python 分隔符截取字符串_python指定分隔符截取字符串
python截取指定分隔符后面的字符串 例如:notifydata[1] =G20-杭州峰会放假时间 notifydata[2] =G20-杭州峰print('-'.join('G20-杭州峰会-放假 ...
- python格式化字符串_Python的3种字符串格式化方法,哪种你最喜欢?
文末扫二维码领[Python开源项目包] 赠书×大厂笔面试题:秋招一直当炮灰?提升你实力的机会来了! 黄伟呢 | 作者数据分析与统计学之美 | 来源 1 3种字符串格式化工具的简单介绍 python2 ...
- python 中文转unicode编码_Python 解码 Unicode 转义字符串
其实,这里要讨论的内容是针对 Python2 的,实际上也是 Python2 中让人头疼的编码问题,而 Python3 则好处理得多. 先来看看例子: >>> s = "我 ...
最新文章
- Prism V2之旅(1)
- JSON数据序列化与反序列化实战
- C++设计模式-开放-封闭原则基本概念与实例
- 超详细的Git提交规范引入指南
- 忆芯科技发布新一代国产主控芯片STAR1000P!4月完成量产版本
- Visual Entity 手册(一)简介
- 强悍的 Linux —— 强悍的 ls
- jzoj3348. 【NOI2013模拟】秘密任务
- google人体浏览器+android,google人体浏览器
- 利用UDP端口转发绕过校园网认证
- UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xff in position 0: illegal multibyte sequence
- 熔断机制什么意思_什么是熔断机制 熔断机制是什么意思
- 怎么用迅捷PDF转换器在线为PDF文件添加文字内容
- nodejs addon实现回调函数事件
- 第十届蓝桥杯C语言B组题解
- R语言低级绘图函数-rect
- 加速度传感器的基本组成
- sketch首款主题管理插件-主题大师
- 商品表(spu)、规格表(sku)设计
- Linux一:Linux启动及登陆
热门文章
- 如何在SAP UI5应用里添加使用摄像头拍照的功能
- Tomcat server launch debug - OrderAnalytics
- Java语言学习之泛型的用法
- 微信小程序开发系列四:微信小程序之控制器的初始化逻辑
- SAP CRM WebClient UI和Hybris backoffice UI开发的相同点
- 如何使用代码获得一个function module的Where Used List
- 8g内存一般占用多少_手记|如何设置虚拟内存
- python tkinter详解 博客园_python tkinter-布局
- 在php中构造函数的作用,php构造函数的作用
- 拦截器读post参数导致接口post请求报错_vue中Axios的封装和API接口的管理