正则表达式模式匹配Python中的日期时间

Vic*_*cky 6 python regex datetime python-3.x pandas

我有一个包含日期时间的字符串,我试图根据日期时间的出现来分割字符串,

data="2018-03-14 06:08:18, he went on \n2018-03-15 06:08:18, lets play"
Run Code Online (Sandbox Code Playgroud)

我在做什么,

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

我得到什么

["2018-03-14 06:08:18, he went on 2018-03-15 06:08:18, lets play"]
Run Code Online (Sandbox Code Playgroud)

我想要的是:

["2018-03-14 06:08:18, he went on","2018-03-15 06:08:18, lets play"]
Run Code Online (Sandbox Code Playgroud)

Wik*_*żew 6

您希望使用至少 1 个空格进行分割,后跟类似日期的模式,因此,您可以使用

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

请参阅正则表达式演示

细节

  • \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']
Run Code Online (Sandbox Code Playgroud)

注意:如果日期之前不能有空格,则在 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.