python日期字符串解析

用python + 正则表达式 实现的日期字符串解析工具:

# -*- coding: utf-8 -*-
#
# 关注易生活,我是小E
# 微信:EasyTool
#
import re
from datetime import date

DATE_PATTERNS = {
u'2013-05-16':u'^(\d{4})[\-\/\.年](\d{1,2})[\-\/\.月](\d{1,2})日{,1}',
u'20130516':u'^(\d{4})(\d{1,2})(\d{1,2})',
u'2013-05':u'^(\d{4})[\-\/\.年](\d{1,2})[\-\/\.月]{,1}()',
u'2013':u'^(\d{4})[\-\/\.年]{,1}()()',
u'05月':u'^()(\d{1,2})[月]()',
u'05-16':u'^()(\d{1,2})[\-\/\.月](\d{1,2})日{,1}'
}

DATE_PATTERNS_TEST = [
u'2013-05-16',
u'2013年05月16',
u'2013年05月16日',

u'20130516',

u'2013-05', 
u'2013年05', 
u'2013-05月',

u'2013',
u'2013年',

u'05月',

u'05-16',
u'05月16',
u'05月16日',

u'05'
]

LANG_PRINT = 'utf-8'

def parse_date(dt_str):
    year, month, day = u'', u'', u''

    for pat_key in DATE_PATTERNS.keys():
        dt_arrs = re.findall(DATE_PATTERNS[pat_key], dt_str)
        if len(dt_arrs)>0:
            dt_arr = dt_arrs[0]
            if len(dt_arr)>0: year  = dt_arr[0]
            if len(dt_arr)>1: month = dt_arr[1]
            if len(dt_arr)>2: day   = dt_arr[2]
            break

    return year, month, day

def test_all():
    for dt_str in DATE_PATTERNS_TEST:
        dt_tuple = parse_date(dt_str)
        if dt_tuple is not None:
            print u'dt_str {0} parse result: {1} {2} {3}'.format(dt_str, dt_tuple[0], dt_tuple[1], dt_tuple[2]).encode(LANG_PRINT)
        else:
            print u'error date format {0}'.format(dt_str).encode(LANG_PRINT)

if __name__ == '__main__':
    test_all()

期间遇到问题:

print 内容需要是utf-8格式,否则会异常

print是标准输出sys.stdout

查看标准输出的编码: print sys.stdout.encoding

<think>我们被要求回答关于“python json字符串解析”的问题,并在最后提出3-5个相关问题。 回答需要包括如何解析JSON字符串,可能涉及json模块的使用,常见问题及解决方案等。 最后,必须输出“§§相关问题§§”并列出3-5个相关问题。</think>### Python解析JSON字符串的全面指南 JSON(JavaScript Object Notation)是Python中处理数据交换的核心格式,以下是高效解析JSON字符串的方法和最佳实践: --- #### 基础解析方法(标准库) ```python import json # 示例JSON字符串 json_str = '{"name": "张三", "age": 30, "skills": ["Python", "数据分析"]}' # 解析Python字典 data = json.loads(json_str) print(data["name"]) # 输出: 张三 print(data["skills"][0]) # 输出: Python ``` --- #### 高级解析技巧 1. **处理特殊数据类型** ```python # 自定义解析器(处理日期格式) def date_decoder(dct): if "birthday" in dct: dct["birthday"] = datetime.fromisoformat(dct["birthday"]) return dct json_str = '{"name": "李四", "birthday": "1990-08-15"}' data = json.loads(json_str, object_hook=date_decoder) print(type(data["birthday"])) # 输出: <class 'datetime.datetime'> ``` 2. **大文件流式解析** ```python # 逐块解析大型JSON文件(避免内存溢出) with open("big_data.json", "r", encoding="utf-8") as f: for line in f: item = json.loads(line) process(item) # 处理每条数据 ``` 3. **非标准JSON处理** ```python # 解析单引号/尾随逗号等非标准JSON non_std_json = "{'name': '王五', age: 25,}" # 注意:非法JSON格式 # 使用demjson3库(需安装) import demjson3 data = demjson3.decode(non_std_json) # 自动修正格式错误 ``` --- #### 错误处理方案 1. **格式验证与修复** ```python def safe_parse(json_str): try: return json.loads(json_str) except json.JSONDecodeError as e: print(f"错误位置: {e.lineno}行, {e.colno}列") # 自动修复常见错误 fixed = json_str.replace("'", '"').replace("None", "null") return json.loads(fixed) ``` 2. **编码问题解决** ```python # 处理\u转义的中文字符 json_str = '{"city": "\u5317\u4eac"}' # 北京 data = json.loads(json_str) print(data["city"]) # 输出: 北京 # 禁止ASCII转义(保留原始中文) json.dumps({"城市": "上海"}, ensure_ascii=False) # 输出: {"城市": "上海"} ``` --- #### 性能优化方案 ```python # 使用orjson替代标准库(速度提升3-5倍) import orjson # pip install orjson data = orjson.loads(json_str) # 支持datetime/numpy等类型 # 使用ujson解析(兼容性好) import ujson # pip install ujson ujson.loads(json_str) # 比标准库快2-3倍 ``` --- ### 关键注意事项 1. **安全警告** ```python # 禁止直接解析不可信来源的JSON(可能执行恶意代码) dangerous_str = '{"__class__": "os.system", "args": ["rm -rf /"]}' # 使用object_hook过滤危险键 def safe_hook(dct): if "__class__" in dct: raise ValueError("危险操作阻止") return dct ``` 2. **数据类型映射表** | JSON类型 | Python类型 | |---------------|-----------------| | object | dict | | array | list | | string | str | | number | int/float | | true/false | True/False | | null | None | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值