轩~ 发表于 2017-7-19 11:49:13

字符串的分割问题

日期字符串的构造函数:设计一个以西文减号分隔的字符串构造函数TDate(string dateStr)。例如,参数字符串可以为“2015-06-19”、“2015-6-19”、“2015-1-1”和“2015-10-1”等。其中,“6”和“06”均是有效的月份。

测试:
测试函数和数据        验证函数与结果
TDate(null)        Output()输出结果:错误信息
TDate(“”)        Output()输出结果:错误信息
TDate(“2015”)        Output()输出结果:错误信息
TDate(“201506”)        Output()输出结果:错误信息
TDate(“20150620”)        Output()输出结果:错误信息
TDate(“-”)        Output()输出结果:错误信息
TDate(“1-1”)        Output()输出结果:错误信息
TDate(“-1”)        Output()输出结果:错误信息
TDate(“1-”)        Output()输出结果:错误信息
TDate(“--”)        Output()输出结果:错误信息
TDate(“-1-”)        Output()输出结果:错误信息
TDate(“-1-1”);        Output()输出结果:错误信息
TDate(“1-1-”)        Output()输出结果:错误信息
TDate(“1--1”)        Output()输出结果:错误信息
TDate(“--1”)        Output()输出结果:错误信息
TDate(“1--”)        Output()输出结果:错误信息
TDate(“1-1-1-”)        Output()输出结果:错误信息
TDate(“-1-1-1”)        Output()输出结果:错误信息
TDate(“10000-1-1”)        Output()输出结果:错误信息
TDate(“9999-0-1”)        Output()输出结果:错误信息
TDate(“1-1-0”)        Output()输出结果:错误信息
TDate(“9999-13-1”)        Output()输出结果:错误信息
TDate(“1-1-32”)        Output()输出结果:错误信息
TDate(“1000-2-29”)        Output()输出结果:错误信息
TDate(“2012-2-29”)        Output()输出结果:2012-02-29
TDate(“1-1-1”)        Output()输出结果:1-01-01
TDate(“02-02-02”)        Output()输出结果:2-02-02
TDate(“9999-12-31”)        Output()输出结果:9999-12-31
TDate(“9999-1-1”)        Output()输出结果:9999-1-1,应该是9999-01-01
TDate(“9999-12-1”)        Output()输出结果:9999-12-1,应该是9999-12-01
TDate(“9999-1-31”)        Output()输出结果:9999-1-31,应该是9999-01-31
TDate(“201a-1a-b3”)        Output()输出结果:错误信息
TDate(“ 2015-12-5”)        Output()输出结果:错误信息
TDate(“2015-12 -5”)        Output()输出结果:错误信息
TDate(“2015-12- 5”)        Output()输出结果:错误信息
TDate(“2 015-12-5”)        Output()输出结果:错误信息
TDate(“2015-1 2-5”)        Output()输出结果:错误信息
TDate(“2015-12-1 5”)        Output()输出结果:错误信息


如果用split函数进行分割,那如果输入没有“-”这个符号就会报错。

求解,怎么完成这个,使得测试数据全部成立

gopythoner 发表于 2017-7-19 17:17:29

你把1-01-01这种也当做时间日期?
那你就没法算了,因为日期函数只会计算1000以后的年份,之前的不计算,也就是说,你要自己去判断那些年份的中哪些是润年,那些有2-29的日期,然后要重写大小月
总之,不科学
科学的计算方法是这样的:import time

def TDate(s):
try:
    t = time.strptime(s, "%Y-%m-%d")
except:
    print("错误信息")
else:
    y,m,d = t
    if m < 10:
      m = "0"+str(m)
    if d < 10:
      d = "0"+str(d)
    result = "-".join(map(str,))
    if k == result:
      print("输出结果:{}".format(k))
    else:
      print("输出结果:{},应该是{}".format(k,result))

思路就是,让Python自带的日期模块去检验这个日期字符串是否符合日期标准
符合标准的按照你的输入要求输出,不符合的自动报错就行
自己写标准你要写的猴年马月

gopythoner 发表于 2017-7-19 17:26:09

本帖最后由 gopythoner 于 2017-7-19 17:28 编辑

还有,如果你非要按照你这个标准去查找时间的话,
我建议你往正则表达式上面想,用正则表达式先把完全不符合你这个格式的踢去
第一步踢去不符合格式的就留下全部满足"年份-月份-日"这种格式
然后把符合格式的留下,进行时间格式筛选
第二部就是踢去像2004-2-28这种关于是否润年的判断,所以要写润年判断
当然,还有,大小月也要判断
毕竟满足时间格式的并不是真的存在的时间

轩~ 发表于 2017-7-20 10:10:14

gopythoner 发表于 2017-7-19 17:17
你把1-01-01这种也当做时间日期?
那你就没法算了,因为日期函数只会计算1000以后的年份,之前的不计算, ...

这个作业的内容就是实现日期类,不能使用原生日期型数据类型和库文件中的,我询问的只是作业的某个部分,也是最后一步。

轩~ 发表于 2017-7-20 10:11:45

gopythoner 发表于 2017-7-19 17:26
还有,如果你非要按照你这个标准去查找时间的话,
我建议你往正则表达式上面想,用正则表达式先把完全不符 ...

我知道要去掉所有不符合格式的,你说的正则表达式我还没有学,想问问你,应该如何用正则表达式去掉所有不符合规范的测试数据。

gopythoner 发表于 2017-7-20 11:36:17

轩~ 发表于 2017-7-20 10:11
我知道要去掉所有不符合格式的,你说的正则表达式我还没有学,想问问你,应该如何用正则表达式去掉所有不 ...

自己去查正则的用法
页: [1]
查看完整版本: 字符串的分割问题