如何优化Python中提取消息的正则表达式性能?含Pandas数据处理需求
优化聊天数据转Pandas DataFrame的高效方案
你的现有方案在小数据集上可行,但大数据集下因为多次正则拆分+循环遍历,耗时会显著增加。下面提供单次正则匹配+直接构造DataFrame的优化方案,既能处理多行消息,又能自动标记群组通知,效率提升明显。
核心思路
用一个包含三个捕获组的正则表达式,一次性扫描所有聊天记录,直接提取date、user、message三个字段:
- 捕获组1:匹配日期时间格式(如
9/6/22, 11:28) - 捕获组2:匹配用户名(仅当存在
用户名:格式时捕获,否则为None) - 捕获组3:匹配消息内容(包括多行文本,自动处理换行)
利用正则的(?s)单行模式让.匹配换行符,确保多行消息被完整捕获;同时通过分支匹配处理「用户消息」和「群组通知」两种场景。
优化后代码
import re import pandas as pd data = """ 9/6/22, 11:28 - Group creator created group "Example" 9/6/22, 11:39 - User1: This is some text 9/6/22, 11:58 - Group creator changed group name to "Example2" 9/6/22, 12:13 - User2: This is some text with multiple lines 9/6/22, 13:13 - Admin changed group profile photo 9/6/22, 14:45 - User3: Hi StackOverflow """ # 核心正则:匹配日期时间,然后分支处理用户消息/群组通知 pattern = r'(?s)(\d{1,2}/\d{1,2}/\d{2,4},\s\d{1,2}:\d{2})\s-\s(?:([\w\W]+?):\s(.*?))?(?=\n\d{1,2}/\d{1,2}/\d{2,4},\s\d{1,2}:\d{2}|\Z)' # 一次性提取所有匹配结果 matches = re.findall(pattern, data.strip()) # 构造DataFrame,处理user为None的情况(标记为群组通知) df = pd.DataFrame(matches, columns=['date', 'user', 'message']) df['user'] = df['user'].fillna('group_notification') # 去除消息内容中的多余换行,替换为空格 df['message'] = df['message'].str.replace('\n', ' ') print(df)
代码说明
正则解析:
(?s):开启单行模式,让.匹配包括换行在内的所有字符(\d{1,2}/\d{1,2}/\d{2,4},\s\d{1,2}:\d{2}):捕获日期时间(?:([\w\W]+?):\s(.*?))?:非捕获组包裹用户和消息,?表示该组可选(对应群组通知场景)(?=\n\d{1,2}/\d{1,2}/\d{2,4},\s\d{1,2}:\d{2}|\Z):正向预查,匹配下一条记录的开始或文本结尾,确保消息内容不会跨记录
效率提升:
- 仅需一次正则扫描即可提取所有字段,避免了原方案中多次
re.split、re.findall和循环遍历的开销 - 利用Pandas的矢量化操作处理
user字段填充和message换行替换,比Python循环快一个数量级
- 仅需一次正则扫描即可提取所有字段,避免了原方案中多次
输出结果
date user message 0 9/6/22, 11:28 group_notification Group creator created group "Example" 1 9/6/22, 11:39 User1 This is some text 2 9/6/22, 11:58 group_notification Group creator changed group name to "Example2" 3 9/6/22, 12:13 User2 This is some text with multiple lines 4 9/6/22, 13:13 group_notification Admin changed group profile photo 5 9/6/22, 14:45 User3 Hi StackOverflow
内容的提问来源于stack exchange,提问作者setibs
相关产品推荐
相关产品推荐

