时间正则表达式
在日常的开发工作中,我们经常需要对时间进行格式化、提取、比较等操作。正则表达式是一种强大的工具,可以用来处理各种形式的时间。在本文中,我们将介绍一些常用的时间正则表达式及其用法。
基础正则表达式符号
在使用时间正则表达式之前,我们需要先了解几个最基本的正则表达式符号:
* .
: 匹配任何单个字符。
* *
: 匹配前面的子表达式零次或多次。
* +
: 匹配前面的子表达式一次或多次。
* ?
: 匹配前面的子表达式零次或一次。
* ^
: 匹配输入字符串的开始位置。
* $
: 匹配输入字符串的结束位置。
* {}
: 指定前面的字符、字符集合或子表达式的重复次数。
时间格式正则表达式
下面是几种常用的时间格式正则表达式:
- 匹配HH:MM格式的时间
^([01]\d|2[0-3]):[0-5]\d$
示例代码:
import re
pattern = re.compile(r'^([01]\d|2[0-3]):[0-5]\d$')
match1 = pattern.match('12:20')
match2 = pattern.match('23:59')
match3 = pattern.match('25:30')
print(match1) # <re.Match object; span=(0, 5), match='12:20'>
print(match2) # <re.Match object; span=(0, 5), match='23:59'>
print(match3) # None
- 匹配YYYY-MM-DD格式的日期
^((19|20)\d{2})-(0[1-9]|1[0-2])-([0-2]\d|3[01])$
示例代码:
import re
pattern = re.compile(r'^((19|20)\d{2})-(0[1-9]|1[0-2])-([0-2]\d|3[01])$')
match1 = pattern.match('2021-12-31')
match2 = pattern.match('2021-02-29')
match3 = pattern.match('21-01-01')
print(match1) # <re.Match object; span=(0, 10), match='2021-12-31'>
print(match2) # None
print(match3) # None
- 匹配YYYY-MM-DD HH:MM格式的日期时间
^((19|20)\d{2})-(0[1-9]|1[0-2])-([0-2]\d|3[01])\s+([01]\d|2[0-3]):[0-5]\d$
示例代码:
import re
pattern = re.compile(r'^((19|20)\d{2})-(0[1-9]|1[0-2])-([0-2]\d|3[01])\s+([01]\d|2[0-3]):[0-5]\d$')
match1 = pattern.match('2021-12-31 23:59')
match2 = pattern.match('2021-02-29 12:34')
match3 = pattern.match('2021-01-01 25:30')
print(match1) # <re.Match object; span=(0, 16), match='2021-12-31 23:59'>
print(match2) # <re.Match object; span=(0, 16), match='2021-02-29 12:34'>
print(match3) # None
时间提取正则表达式
有时我们需要从一段文本中提取出其中包含的时间,这时我们可以使用时间提取正则表达式。下面是几种常用的时间提取正则表达式:
- 提取HH:MM格式的时间
([01]\d|2[0-3]):[0-5]\d
示例代码:
“`pythonimport re
text = 'Hello, the meeting will start at 14:30. Please be on time.'
pattern = re.compile(r'([01]\d|2[0-3]):[0-5]\d')
match = pattern.search(text)
print(match.group()) # 14:30
<pre><code class="line-numbers">2. 提取YYYY-MM-DD格式的日期
“`regex
(19|20)\d{2}-(0[1-9]|1[0-2])-([0-2]\d|3[01])
示例代码:
import re
text = 'The program was last updated on 2021-10-01.'
pattern = re.compile(r'(19|20)\d{2}-(0[1-9]|1[0-2])-([0-2]\d|3[01])')
match = pattern.search(text)
print(match.group()) # 2021-10-01
- 提取YYYY-MM-DD HH:MM格式的日期时间
(19|20)\d{2}-(0[1-9]|1[0-2])-([0-2]\d|3[01])\s+([01]\d|2[0-3]):[0-5]\d
示例代码:
import re
text = 'The meeting will start at 2021-12-31 23:59. Don\'t be late.'
pattern = re.compile(r'(19|20)\d{2}-(0[1-9]|1[0-2])-([0-2]\d|3[01])\s+([01]\d|2[0-3]):[0-5]\d')
match = pattern.search(text)
print(match.group()) # 2021-12-31 23:59
时间比较正则表达式
有时我们需要判断两个时间的先后关系,这时我们可以使用时间比较正则表达式。下面是几种常用的时间比较正则表达式:
- 判断HH:MM格式的时间先后关系
^([01]\d|2[0-3]):[0-5]\d(AM|PM)?\s*(<|<=|>|>=|=)\s*([01]\d|2[0-3]):[0-5]\d(AM|PM)?$
示例代码:
import re
pattern = re.compile(r'^([01]\d|2[0-3]):[0-5]\d(AM|PM)?\s*(<|<=|>|>=|=)\s*([01]\d|2[0-3]):[0-5]\d(AM|PM)?$')
# 12:30 PM < 1:30 PM
match1 = pattern.match('12:30 PM < 1:30 PM')
print(match1) # <re.Match object; span=(0, 16), match='12:30 PM < 1:30 PM'>
# 10:00 <= 11:00
match2 = pattern.match('10:00 <= 11:00')
print(match2) # <re.Match object; span=(0, 12), match='10:00 <= 11:00'>
# 2:00 PM >= 1:00 PM
match3 = pattern.match('2:00 PM >= 1:00 PM')
print(match3) # <re.Match object; span=(0, 16), match='2:00 PM >= 1:00 PM'>
# Invalid format
match4 = pattern.match('12:30 PM < 13:30 PM')
print(match4) # None
# Invalid time
match5 = pattern.match('25:30 < 12:30 PM')
print(match5) # None
- 判断YYYY-MM-DD格式的日期先后关系
^((19|20)\d{2})-(0[1-9]|1[0-2])-([0-2]\d|3[01])(<|<=|>|>=|=)((19|20)\d{2})-(0[1-9]|1[0-2])-([0-2]\d|3[01])$
示例代码:
import re
pattern = re.compile(r'^((19|20)\d{2})-(0[1-9]|1[0-2])-([0-2]\d|3[01])(<|<=|>|>=|=)((19|20)\d{2})-(0[1-9]|1[0-2])-([0-2]\d|3[01])$')
# 2021-10-01 <= 2022-01-01
match1 = pattern.match('2021-10-01 <= 2022-01-01')
print(match1) # <re.Match object; span=(0, 20), match='2021-10-01 <= 2022-01-01'>
# 2025-12-01 >= 2024-01-01
match2 = pattern.match('2025-12-01 >= 2024-01-01')
print(match2) # <re.Match object; span=(0, 20), match='2025-12-01 >= 2024-01-01'>
# Invalid format
match3 = pattern.match('2021-13-01 <= 2022-01-01')
print(match3) # None
# Invalid date
match4 = pattern.match('2022-02-30 > 2022-02-01')
print(match4) # None
- 判断YYYY-MM-DD HH:MM格式的日期时间先后关系
^((19|20)\d{2})-(0[1-9]|1[0-2])-([0-2]\d|3[01])\s+([01]\d|2[0-3]):[0-5]\d(<|<=|>|>=|=)((19|20)\d{2})-(0[1-9]|1[0-2])-([0-2]\d|3[01])\s+([01]\d|2[0-3]):[0-5]\d$
示例代码:
import re
pattern = re.compile(r'^((19|20)\d{2})-(0[1-9]|1[0-2])-([0-2]\d|3[01])\s+([01]\d|2[0-3]):[0-5]\d(<|<=|>|>=|=)((19|20)\d{2})-(0[1-9]|1[0-2])-([0-2]\d|3[01])\s+([01]\d|2[0-3]):[0-5]\d$')
# 2021-12-31 23:59 <= 2022-01-01 00:00
match1 = pattern.match('2021-12-31 23:59 <= 2022-01-01 00:00')
print(match1) # <re.Match object; span=(0, 30), match='2021-12-31 23:59 <= 2022-01-01 00:00'>
# 2021-01-01 00:00 >= 2020-12-31 23:59
match2 = pattern.match('2021-01-01 00:00 >= 2020-12-31 23:59')
print(match2) # <re.Match object; span=(0, 30), match='2021-01-01 00:00 >= 2020-12-31 23:59'>
# Invalid format
match3 = pattern.match('2021-13-01 <= 2022-01-01 01:00')
print(match3) # None
# Invalid date
match4 = pattern.match('2022-02-30 > 2022-02-01 12:34')
print(match4) # None
# Invalid time
match5 = pattern.match('2022-01-01 24:00 > 2021-12-31 23:59')
print(match5) # None
结论
通过本文,我们了解了常用的时间正则表达式及其用法。在实际的开发工作中,我们可以根据需要选择相应的正则表达式进行处理。