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

本文介绍了一种使用Python正则表达式进行日期格式匹配的方法,并通过一个简单的验证函数确保匹配到的日期是有效的。文中提供了如何从文本中抽取日期的例子,并展示了如何避免无效日期的陷阱。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import re
from datetime import datetime


test_date = '他的生日是2016-12-12 14:34,是个可爱的小宝贝.二宝的生日是2016-12-21 11:34,好可爱的.'


test_datetime = '他的生日是2016-12-12 14:34,是个可爱的小宝贝.二宝的生日是2016-12-21 11:34,好可爱的.'


# date
mat = re.search(r"(\d{4}-\d{1,2}-\d{1,2})",test_date)
print mat.groups()
# ('2016-12-12',)
print mat.group(0)
# 2016-12-12


date_all = re.findall(r"(\d{4}-\d{1,2}-\d{1,2})",test_date)
for item in date_all:
    print item
# 2016-12-12
# 2016-12-21


# datetime
mat = re.search(r"(\d{4}-\d{1,2}-\d{1,2}\s\d{1,2}:\d{1,2})",test_datetime)
print mat.groups()
# ('2016-12-12 14:34',)
print mat.group(0)
# 2016-12-12 14:34


date_all = re.findall(r"(\d{4}-\d{1,2}-\d{1,2}\s\d{1,2}:\d{1,2})",test_datetime)
for item in date_all:
    print item
# 2016-12-12 14:34
# 2016-12-21 11:34
## 有效时间


# 如这样的日期2016-12-35也可以匹配到.测试如下.
test_err_date = '如这样的日期2016-12-35也可以匹配到.测试如下.'
print re.search(r"(\d{4}-\d{1,2}-\d{1,2})",test_err_date).group(0)
# 2016-12-35


# 可以加个判断
def validate(date_text):
    try:
        if date_text != datetime.strptime(date_text, "%Y-%m-%d").strftime('%Y-%m-%d'):
            raise ValueError
        return True
    except ValueError:
        # raise ValueError("错误是日期格式或日期,格式是年-月-日")
        return False


print validate(re.search(r"(\d{4}-\d{1,2}-\d{1,2})",test_err_date).group(0))
# false


# 其他格式匹配. 如2016-12-24与2016/12/24的日期格式.
date_reg_exp = re.compile('\d{4}[-/]\d{2}[-/]\d{2}')


test_str= """
     平安夜圣诞节2016-12-24的日子与去年2015/12/24的是有不同哦.
     """
# 根据正则查找所有日期并返回
matches_list=date_reg_exp.findall(test_str)


# 列出并打印匹配的日期
for match in matches_list:
  print match


# 2016-12-24

# 2015/12/24

-------参考网址----https://www.cnblogs.com/OnlyDreams/p/7845527.html

------作者------'Randy'

### 分组匹配的基本用法 在 Python 的 `re` 模块中,正则表达式通过使用圆括号 `()` 来定义分组。分组可以将一部分模式封装成一个整体,用于捕获特定内容、重复匹配或引用前面的匹配结果。 - **简单分组** 使用 `(ab)` 可以将 `ab` 作为一个整体进行匹配。例如,正则表达式 `(abc)+` 可以匹配 `abcabcabc`,表示 `abc` 这个组合可以重复多次[^1]。 - **分枝条件** 使用 `|` 可以实现分枝条件,即匹配左边或右边的表达式。例如,正则表达式 `(0\d{2})-\d{8}|0\d{2}-\d{8}` 可以匹配两种格式的电话号码:一种是前面带有区号且没有连字符的格式(如 `01012345678`),另一种是包含连字符的格式(如 `010-12345678`)[^3]。 ### 分组的引用 - **反向引用** 使用 `\num` 可以引用之前第 `num` 个分组匹配的内容。例如,正则表达式 `(\d{1,3})(\.\d{1,3}){3}` 可以用来匹配 IP 地址,其中第一个分组 `(\d{1,3})` 匹配 IP 地址的第一个数字部分,后续的 `\.` 表示匹配点号。如果需要确保 IP 地址的四个部分都相同,可以使用 `\1` 来引用第一个分组的值。 - **命名分组** 使用 `(?P<name>...)` 可以为分组命名,便于后续引用。例如,正则表达式 `(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})` 可以匹配日期格式 `YYYY-MM-DD`,并且可以通过 `(?P=year)`、`(?P=month)` 和 `(?P=day)` 分别引用年、月、日的值[^1]。 ### Python 示例 以下示例展示了如何在 Python 中使用分组匹配: ```python import re text = "abc123abc456abc789" result = re.search(r"(abc)(123)(abc)", text) print(result.group()) # 输出整个匹配结果 "abc123abc" print(result.group(0)) # 输出整个匹配结果 "abc123abc" print(result.group(1)) # 输出第一个分组匹配的内容 "abc" print(result.group(2)) # 输出第二个分组匹配的内容 "123" print(result.group(3)) # 输出第三个分组匹配的内容 "abc" ``` 该代码中,正则表达式 `(abc)(123)(abc)` 将匹配 `abc123abc`,并分别捕获三个分组的内容[^2]。 ### 命名分组示例 ```python import re pattern = r"(?P<username>[a-zA-Z0-9]+)_(?P<hash>[a-z0-9]{32})" text = "user123_1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d" match = re.search(pattern, text) if match: print("Username:", match.group('username')) # 输出 "user123" print("Hash:", match.group('hash')) # 输出 "1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d" ``` 此示例中,正则表达式 `(?P<username>[a-zA-Z0-9]+)_(?P<hash>[a-z0-9]{32})` 使用命名分组来提取用户名和哈希值。 ### 反向引用示例 ```python import re # 匹配重复的单词 pattern = r"\b(\w+)\b\s+\1" text = "hello hello world world" matches = re.findall(pattern, text) print(matches) # 输出 ['hello', 'world'] ``` 该代码中,`\1` 引用了第一个分组 `(\w+)`,表示匹配重复的单词。 ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值