首页 > 解决方案 > 正则表达式模式匹配python中的日期时间

问题描述

我有一个包含日期时间的字符串,我正在尝试根据日期时间的出现来拆分字符串,

data="2018-03-14 06:08:18, he went on \n2018-03-15 06:08:18, lets play"

我在做什么,

out=re.split('^(2[0-3]|[01]?[0-9]):([0-5]?[0-9]):([0-5]?[0-9])$',data)

我得到了什么

["2018-03-14 06:08:18, he went on 2018-03-15 06:08:18, lets play"]

我想要的是:

["2018-03-14 06:08:18, he went on","2018-03-15 06:08:18, lets play"]

标签: pythonregexpython-3.xpandasdatetime

解决方案


您想用至少 1 个空格和类似日期的模式进行拆分,因此,您可以使用

re.split(r'\s+(?=\d{2}(?:\d{2})?-\d{1,2}-\d{1,2}\b)', s)

查看正则表达式演示

细节

  • \s+- 1+ 空白字符
  • (?=\d{2}(?:\d{2})?-\d{1,2}-\d{1,2}\b)- 一个积极的前瞻,确保在当前位置的左侧,有
    • \d{2}(?:\d{2})?- 2 或 4 位数字
    • -- 一个连字符
    • \d{1,2}- 1 或 2 位数字
    • -\d{1,2}- 又是一个连字符和 1 或 2 位数字
    • \b - 一个单词边界(如果没有必要,删除它,或者替换为(?!\d),以防您可能将日期粘在字母或其他文本上)

Python演示

import re
rex = r"\s+(?=\d{2}(?:\d{2})?-\d{1,2}-\d{1,2}\b)"
s = "2018-03-14 06:08:18, he went on 2018-03-15 06:08:18, lets play"
print(re.split(rex, s))
# => ['2018-03-14 06:08:18, he went on', '2018-03-15 06:08:18, lets play']

注意如果在日期之前不能有空格,在 Python 3.7 和更新版本中你可以使用r"\s*(?=\d{2}(?:\d{2})?-\d{1,2}-\d{1,2}\b)"(注意*带有它的量词\s*将允许零长度匹配)。对于旧版本,您将需要使用@blhsing 建议的解决方案或安装PyPi 正则表达式模块r"(?V1)\s*(?=\d{2}(?:\d{2})?-\d{1,2}-\d{1,2}\b)"使用regex.split.


推荐阅读