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

Posted

技术标签:

【中文标题】正则表达式模式匹配python中的日期时间【英文标题】:regex pattern to match datetime in 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 版本? python版本是3.6.3 是否存在项目之间没有空格的情况?我们可以假设我们想用至少 1 个空格和一个日期来分割吗? 好吧,我的意思是建议像 r'\s+(?=(?:(?:20)?[01]?[0-9])-(?:1[0-2]|0?[0-9])-(?:[0-2]?[0-9]|3[01]))' 这样的拆分。 【参考方案1】:

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

re.split(r'\s+(?=\d2(?:\d2)?-\d1,2-\d1,2\b)', s)

见regex demo

详情

\s+ - 1+ 个空格字符 (?=\d2(?:\d2)?-\d1,2-\d1,2\b) - 正向预测,确保在当前位置的左侧,有 \d2(?:\d2)? - 2 或 4 位数字 - - 一个连字符 \d1,2 - 1 位或 2 位数字 -\d1,2 - 又是一个连字符和 1 或 2 位数字 \b - 单词边界(如果不需要,请将其删除,或替换为 (?!\d),以防您可能将日期粘在字母或其他文本上)

Python demo:

import re
rex = r"\s+(?=\d2(?:\d2)?-\d1,2-\d1,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*(?=\d2(?:\d2)?-\d1,2-\d1,2\b)"(注意 *\s* 的量词将允许零长度匹配)。对于旧版本,您需要使用解决方案as @blhsing suggests 或安装PyPi regex module 并将r"(?V1)\s*(?=\d2(?:\d2)?-\d1,2-\d1,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'\d4-\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+(?=\d2(?:\d2)?-\d1,2-\d1,2\b)', s) 可能是更好的选择。 @blhsing 它只返回我实际数据中的最后一次出现 @pyd 我明白了。如果字符串中有'\n',您只需将re.DOTALL 标志添加到findall。我已经相应地更新了我的答案。 谢谢@blhsing的回答 @pyd 不客气。事实上,如果每个日期/时间之前总是有一个'\n',你不妨使用`str.split('\n')` 来得到你想要的。

以上是关于正则表达式模式匹配python中的日期时间的主要内容,如果未能解决你的问题,请参考以下文章

python正则表达式匹配中文日期时间

python正则表达式匹配中文日期时间

python笔记-正则表达式

使用 python 正则表达式匹配日期

python中的正则表达式

Python: 正则表达式匹配多行,实现多行匹配模式