使用python正则表达式来匹配时间

时间:2013-12-07 03:27:42

标签: python regex

我正在尝试以下午6:30或早上7点或午夜的形式解析csv文件。我已经搜索过python文档中正则表达式的文档,但是无法成功实现它们。

我第一次尝试匹配它们是:

re.findall(r'^d{1,2}(:d{1,2})?$', string)

但是这没用。我有括号和问号,因为有时并不总是超过小时。此外,我甚至没有开始考虑如何匹配上午和下午。 任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:4)

首先,要匹配您需要的数字\d,而不仅仅是d

re.findall(r'^\d{1,2}(:\d{1,2})?$', string)

其次,正如所写的那样,你的正则表达式只会匹配一个字符串,而这个字符串恰好是一次而不是其他,因为^表示“字符串的开头”而$表示字符串的结尾。如果你想在整个字符串中找到所有的时间,可以省略它们:

re.findall(r'\d{1,2}(:\d{1,2})?', string)

就上午/下午而言,你可以添加另一个可选组:

re.findall(r'\d{1,2}(:\d{1,2})?(am|pm)?', string)

当然,因为除了前1位或2位数字之外的所有内容都是可选的,您还将匹配任何一位或两位数字。你可以改为至少要么是am / pm还是冒号和两个以上的数字:

re.findall(r'\d{1,2}((am|pm)|(:\d{1,2})(am|pm)?)', string)

但是,findall表现得有点奇怪:如果你的模式中有匹配的组,它只返回组而不是完全匹配。因此,您可以将它们更改为不匹配的组:

re.findall(r'\d{1,2}(?:(?:am|pm)|(?::\d{1,2})(?:am|pm)?)', string)

答案 1 :(得分:1)

如果您正在严格寻找正则表达式解决方案。您可以使用:

re.findall(r'^\d{1,2}(:\d{1,2})?$', string)

但等等

并非全部。没有正则表达式,有一种更好的方法可以做到这一点;)。您可以使用python CSV 解析功能。

import csv
string = "November,Monday,6:30pm,1989"
csv_reader = csv.reader( [ string ] )
for row in csv_reader:
    print row 

输出

['November', 'Monday', '6:30pm', '1989']

答案 2 :(得分:0)

import re 
regex = r'(\d{1,2})([.:](\d{1,2}))?[ ]?(am|pm)?' 
groups = re.findall(regex, value)

group1将给hr
group3将给min
group4将给出am / pm

示例:
下午12点
12.30pm
12:30 pm
上午2.30
所有这些示例都有效