【问题标题】:regex pattern to match datetime in python正则表达式模式匹配python中的日期时间
【发布时间】:2018-12-25 23:51:57
【问题描述】:

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

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"]

【问题讨论】:

标签: python regex python-3.x pandas datetime


【解决方案1】:

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

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

regex demo

详情

  • \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 demo:

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* 的量词将允许零长度匹配)。对于旧版本,您需要使用解决方案as @blhsing suggests 或安装PyPi regex module 并将r"(?V1)\s*(?=\d{2}(?:\d{2})?-\d{1,2}-\d{1,2}\b)"regex.split 一起使用。

【讨论】:

    【解决方案2】:

    re.split 适用于您有特定分隔符模式的情况。使用带有前瞻模式的re.findall

    import re
    data="2018-03-14 06:08:18, he went on \n2018-03-15 06:08:18, lets play"
    d = r'\d{4}-\d?\d-\d?\d (?:2[0-3]|[01]?[0-9]):[0-5]?[0-9]:[0-5]?[0-9]'
    print(re.findall(r'{0}.*?(?=\s*{0}|$)'.format(d), data, re.DOTALL))
    

    这个输出:

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

    【讨论】:

    • 请注意,带有前瞻的惰性点可能会占用太多资源,因为在惰性点之前的子模式之后的每个字符之后都会检查前瞻模式。如果要求用 1 个或多个空格进行分割,然后跟日期之类的东西,re.split(r'\s+(?=\d{2}(?:\d{2})?-\d{1,2}-\d{1,2}\b)', s) 可能是更好的选择。
    • @blhsing 它只返回我实际数据中的最后一次出现
    • @pyd 我明白了。如果字符串中有'\n',您只需将re.DOTALL 标志添加到findall。我已经相应地更新了我的答案。
    • 谢谢@blhsing的回答
    • @pyd 不客气。事实上,如果每个日期/时间之前总是有一个'\n',你不妨使用`str.split('\n')` 来得到你想要的。
    猜你喜欢
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    • 2011-08-24
    • 2012-04-16
    • 2012-04-16
    • 1970-01-01
    相关资源
    最近更新 更多