【问题标题】:how can i convert PT7M37S iso 8601 format to duration in seconds using regular expressions如何使用正则表达式将 PT7M37S iso 8601 格式转换为持续时间(以秒为单位)
【发布时间】:2018-09-12 14:34:12
【问题描述】:

我在数据框中有一列具有 PT7M37S 类型值,我想将它们全部转换为持续时间的秒数。我正在考虑使用正则表达式匹配字符串,然后解析整数。

这是我目前的代码:match = re.match('PT(\d+H)?(\d+M)?(\d+S)?', duration).groups()

hours = _js_parseInt(match[0]) if match[0] else 0
minutes = _js_parseInt(match[1]) if match[1] else 0
seconds = _js_parseInt(match[2]) if match[2] else 0

还有其他方法吗?

【问题讨论】:

  • 如果可行,您可能应该将问题发布到Code Review
  • 重新发明轮子有什么特别的原因吗?有现成的库可以更好地完成这方面的工作。
  • 很遗憾,图书馆不适合我
  • @AbhinavDixit 那么要么你做错了,要么你在问题中歪曲了数据。 PT7M37S 将被解析,至少 isodate 库没有任何问题。

标签: regex python-3.x pandas


【解决方案1】:

以下是一些反馈:

  • 如果将(\d+H)? 更改为(?:(\d+)H)?\d+H 是可选的,但只会捕获\d+。这使得之后更容易转换成 Python 整数。

  • 您可以使用int(n or 0) 将一些n 转换为字符串或None 的整数。我不确定你为什么要在 Python 中使用 _js_parseInt,因为你知道它们只是整数。

  • 您可以一次处理re.match(...).groups() 的所有值:

    match = re.match(r'PT(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?', 'PT7M37S')
    (hours, minutes, seconds) = [ int(n or 0) for n in match.groups() ]
    
  • 小心re.match(...).groups();如果匹配失败,re.match(...)None 并且在其上调用.groups() 将导致AttributeError 异常。您应该考虑这种极端情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    相关资源
    最近更新 更多