字符串索引越界问题:聊天数据拆分至DataFrame的正则替代方案优化
修复聊天数据拆分的索引越界问题并生成DataFrame
问题根源
- 原代码直接使用固定偏移量(如
i+21、i+22)访问字符串索引,当循环到字符串末尾附近时,偏移后的索引会超出字符串长度,触发string index out of range错误。 - 内部循环硬编码固定上限
342671,完全不考虑实际数据长度,同样会导致索引越界。 - 手动判断日期格式的逻辑过于死板,一旦聊天记录的日期格式有细微变化(如12/24小时制切换),代码直接失效。
解决方案:用正则表达式替代手动索引操作
正则表达式可以精准匹配符合格式的聊天记录,从根源上避免索引越界问题,同时适配更灵活的格式变化。
代码实现
import re import pandas as pd # 假设data是你的原始聊天字符串 # 匹配聊天记录的正则模式,适配示例中的日期格式 pattern = r'\[(\d{2}/\d{2}/\d{2}, \d{1,2}:\d{2}:\d{2} [AP]M)\] .*?: (.*?)(?=\n\[|\Z)' # 查找所有匹配的记录,re.DOTALL允许匹配多行消息 matches = re.findall(pattern, data, re.DOTALL) # 拆分日期和消息列表 dateList = [match[0] for match in matches] messageList = [match[1].strip() for match in matches] # 生成DataFrame chat_df = pd.DataFrame({ '日期': dateList, '消息': messageList }) # 查看结果 print(chat_df.head())
代码说明
pattern中的分组分别捕获日期部分和消息内容:- 第一个分组
(\d{2}/\d{2}/\d{2}, \d{1,2}:\d{2}:\d{2} [AP]M)匹配并提取日期时间字符串; - 第二个分组
(.*?)(?=\n\[|\Z)匹配消息内容,直到下一条记录的开头(\n\[)或字符串结尾(\Z),支持多行消息。
- 第一个分组
re.DOTALL参数让.可以匹配换行符,解决多行消息的匹配问题。- 最终通过列表推导式拆分日期和消息,直接生成DataFrame,逻辑简洁可靠。
内容的提问来源于stack exchange,提问作者Ekta Mistry
相关产品推荐
相关产品推荐

