我正在尝试以下午6:30或早上7点或午夜的形式解析csv文件。我已经搜索过python文档中正则表达式的文档,但是无法成功实现它们。
我第一次尝试匹配它们是:
re.findall(r'^d{1,2}(:d{1,2})?$', string)
但是这没用。我有括号和问号,因为有时并不总是超过小时。此外,我甚至没有开始考虑如何匹配上午和下午。 任何帮助表示赞赏!
答案 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
所有这些示例都有效