www.zhblog.net

正则表达式系列(五):匹配正确的时间

匹配时间并不麻烦,但要匹配正确的时间,过滤掉不正确的时间,就需要更复杂的表达式。

s1 = '9:17 am'   # yes

s2 = '12:30 pm'  # yes

s3 = '99:99 pm'  # no


这三个时间,第一个和第二个是合法时间。第三个不是合法时间,使用通用匹配也就无法过滤掉。

pattern = re.compile(r'^\d{1,2}:\d{1,2}\s+[a|p]m$')


要想达到我们想要的结果,就应该继续将规则细化,分段处理。这也是一种思想。

pattern2 = re.compile(r'^(?:[1-9]|1[0-9]|2[0-3]):[0-5][0-9]\s+[ap]m$')


分段处理有很多种,这里只讨论上面这个,逻辑相对简单、清晰。

按位分段处理:

1.时间的小时合法范围是1-23(0和24是不写的)。

2.最大是2位数字,最小为1为数字。

3.为1位数时,范围是[1-9]

4.为2位数时,第一位可以是1,第二位可以是[0-9],范围为10-19;第一位也可以是2,第二位则是[0-3],范围是20-23。

5.然后是:符号。

6.分钟是固定的0-59。第一位则是[0-5],第二位是[0-9]

7.最后就是空白和ampm


经过像上面对时间规则的细分,它就可以过滤掉不合理的时间了,因为我们是按照合理的时间格式来添加的规则(如果不够,继续添加规则)


效果:

import re





def main():

    s1 = '9:17 am'   # yes

    s2 = '12:30 pm'  # yes

    s3 = '99:99 pm'  # no

    pattern = re.compile(r'^\d{1,2}:\d{1,2}\s+[a|p]m$')

    m1 = re.search(pattern, s1)

    print(m1)

    m2 = re.search(pattern, s2)

    print(m2)

    m3 = re.search(pattern, s3)

    print(m3)



    pattern2 = re.compile(r'^(?:[1-9]|1[0-9]|2[0-3]):[0-5][0-9]\s+[ap]m$')

    m1 = re.search(pattern2, s1)

    print(m1)

    m2 = re.search(pattern2, s2)

    print(m2)

    m3 = re.search(pattern2, s3)

    print(m3)





if __name__ == '__main__':

    main()


<re.Match object; span=(0, 7), match='9:17 am'>

<re.Match object; span=(0, 8), match='12:30 pm'>

<re.Match object; span=(0, 8), match='99:99 pm'>

<re.Match object; span=(0, 7), match='9:17 am'>

<re.Match object; span=(0, 8), match='12:30 pm'>

None


可以看到第一个通用表达式是无法过滤s3的。第二个细化后表达式可以匹配正确的时间,过滤s3

 

展开阅读全文

评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 心情