从字符串_不清楚的格式中提取小时

时间:2019-01-27 08:45:53

标签: python regex

这个问题也许重复了,但是我没有找到任何确切的解决方案。我有包含日期​​和时间的这种字符串。

"check_in": "10/25/2019 14:30"

我需要从中提取一个小时,但这并不总是有效的格式。到目前为止,我已经尝试过这种模式,但是它包含“:”字符。

  

\ d +?(:)

     

(\ d +:)

     

(\ d +)*:

3 个答案:

答案 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)

\d+(?=:)

Demo

您不需要匹配:,但需要检查它。因此,请使用Positive Lookahead (?=:)

答案 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