正则表达式模式匹配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中的日期时间的主要内容,如果未能解决你的问题,请参考以下文章