求助: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! 🤣" 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! 🤣" 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! 🤣" 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
相关产品推荐
相关产品推荐

