这个问题也许重复了,但是我没有找到任何确切的解决方案。我有包含日期和时间的这种字符串。
"check_in": "10/25/2019 14:30"
我需要从中提取一个小时,但这并不总是有效的格式。到目前为止,我已经尝试过这种模式,但是它包含“:”字符。
\ d +?(:)
(\ d +:)
(\ d +)*:
答案 0 :(得分:4)
正则表达式并非始终是处理表示日期的字符串的最佳方法,尤其是在您不能依靠输入格式保持一致的情况下。改用专门的解析器:
>>> from dateutil import parser
>>> parser.parse("10/25/2019 14:30").hour
14
>>> parser.parse("10/25/2019 2:30 PM").hour
14
>>> parser.parse("2019-10-25T143000").hour
14
模块dateutil
不在标准库中,但值得下载。
答案 1 :(得分:1)
答案 2 :(得分:0)
首先,这是您的正则表达式的问题:
\d+?(:)
-查找数字和列(14:
)并将列归为一组(\d+:)
-查找数字和列(14:
)并将其全部归为一组(\d+)*:
-查找(可选地,由于*
)数字和列(14:
)并将数字归为一组因此,最后一个可以工作:
>>> match = re.search(r'(\d+)*:', "10/25/2019 14:30")
>>> match.group(0) # whole result
'14:'
>>> match.group(1) # just the number
'14'
但是话又说回来,它会在“时间:14:30”之类的东西上给出错误的结果(而不是中断),从而使以后很难调试该错误。您想要的是使用更严格的搜索,例如匹配整个字符串并标记所有组:
>>> regex = r'(?P<month>\d\d)/(?P<day>\d\d)/(?P<year>\d{4}) (?P<hour>\d\d):(?P<minute>\d\d)'
>>> re.search(regex, "10/25/2019 14:30").group('hour')
'14'
另一种更简单,甚至更安全的方法是使用strptime:
>>> import datetime
>>> datetime.datetime.strptime("10/25/2019 14:30", "%m/%d/%Y %H:%M")
datetime.datetime(2019, 10, 25, 14, 30)
现在您有了完整的datetime对象,并且可以根据需要提取.hour
。