You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:Python高效提取格式化短信中readable_date对应日期子串

高效提取短信行中的readable_date值

嘿,针对你要从几千条短信记录里提取readable_date的需求,我给你整理了几个实用又高效的方法,完全能搞定4-5k条数据的处理:

方法1:正则表达式(灵活通用)

正则表达式非常适合匹配这种有固定格式的字符串片段,处理速度完全能跟上你的数据量。我们可以直接写一个模式,精准匹配readable_date="后面到下一个双引号之间的内容:

import re

# 示例行
sms_line = '<sms protocol="0" address="+##########" date="1557093540527" type="1" subject="null" body="Don\'t text and drive! &#129315;" toa="null" sc_toa="null" service_center="+##########" read="1" status="-1" locked="0" date_sent="1557093540000" sub_id="2" readable_date="May 5, 2019 5:59:00 PM" contact_name="XXXX" />'

# 匹配readable_date的值
match = re.search(r'readable_date="([^"]+)"', sms_line)
if match:
    readable_date = match.group(1)
    print(readable_date)  # 输出: May 5, 2019 5:59:00 PM

这个正则模式readable_date="([^"]+)"的意思是:找到readable_date="开头的部分,然后捕获所有不是双引号的字符(也就是日期内容),直到遇到下一个双引号为止。

方法2:XML解析(最健壮)

因为你的短信行本身就是标准的XML标签格式,用XML解析库来处理会更稳妥,不怕字符串格式有小变动(比如属性顺序变化)。Python自带的xml.etree.ElementTree就足够用:

import xml.etree.ElementTree as ET

sms_line = '<sms protocol="0" address="+##########" date="1557093540527" type="1" subject="null" body="Don\'t text and drive! &#129315;" toa="null" sc_toa="null" service_center="+##########" read="1" status="-1" locked="0" date_sent="1557093540000" sub_id="2" readable_date="May 5, 2019 5:59:00 PM" contact_name="XXXX" />'

# 将单行解析为XML元素
sms_element = ET.fromstring(sms_line)
# 直接获取readable_date属性的值
readable_date = sms_element.get('readable_date')
print(readable_date)  # 输出: May 5, 2019 5:59:00 PM

这种方法完全遵循XML规范,即使后续短信行的属性顺序改变,也能准确提取到目标值,容错性最强。

方法3:字符串分割(最简单高效)

如果你的短信格式完全固定(readable_date="的位置和格式不会变),用字符串的split方法是最快的,代码也最简洁:

sms_line = '<sms protocol="0" address="+##########" date="1557093540527" type="1" subject="null" body="Don\'t text and drive! &#129315;" toa="null" sc_toa="null" service_center="+##########" read="1" status="-1" locked="0" date_sent="1557093540000" sub_id="2" readable_date="May 5, 2019 5:59:00 PM" contact_name="XXXX" />'

# 先按readable_date="分割,取第二部分;再按"分割,取第一部分
readable_date = sms_line.split('readable_date="')[1].split('"')[0]
print(readable_date)  # 输出: May 5, 2019 5:59:00 PM

这个方法没有额外依赖,纯字符串操作,速度是三者里最快的,适合格式完全固定的场景。

后续:转成datetime对象插入SQL

提取到日期字符串后,你可以把它转成Python的datetime对象,这样插入SQL数据库会更方便(大部分SQL数据库都支持直接存储datetime类型):

from datetime import datetime

date_str = "May 5, 2019 5:59:00 PM"
# 按照日期字符串的格式解析
datetime_obj = datetime.strptime(date_str, "%B %d, %Y %I:%M:%S %p")
print(datetime_obj)  # 输出: 2019-05-05 17:59:00

之后用数据库连接库(比如sqlite3、psycopg2等)把datetime_obj插入对应的字段即可。

内容的提问来源于stack exchange,提问作者Orrd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:22:50