正则表达式括号不匹配报错及聊天记录解析代码修复求助
聊天记录解析代码的正则括号错误修复
核心错误分析
报错error: unbalanced parenthesis at position 31完全是date_time函数里的正则表达式括号不匹配导致的:
原正则代码:
pattern='^([0-9]+)(\/)([0-9]+)(\/)[0-9]+),([0-9]+), ([0-9]+)[]?(AM|PM|am|pm)?-'
存在三个明确问题:
- 日期部分的
[0-9]+)多了一个多余的右括号,破坏了括号配对逻辑 - 中间的
[]?是空字符集,无实际匹配意义,应该替换为\s?用来匹配时间与AM/PM之间的可选空格 - 时间部分的匹配逻辑不符合常规聊天记录格式(比如常见的
HH:MM而非HH, MM)
修正后的date_time函数
结合主流聊天记录(如WhatsApp)的格式(例:10/05/23, 12:30 PM - ),修正后的函数如下:
def date_time(s): # 匹配格式:DD/MM/YYYY, HH:MM AM/PM - (支持大小写、空格可选) pattern=r'^([0-9]{1,2})\/([0-9]{1,2})\/([0-9]{2,4}), ([0-9]{1,2}):([0-9]{2})\s?(AM|PM|am|pm)? -' result= re.match(pattern,s) return bool(result)
如果你的聊天记录时间格式是用逗号分隔时分的特殊样式,可将时间部分调整为([0-9]+), ([0-9]+),但必须保证所有括号完全配对。
代码中的其他隐性错误
除正则问题外,代码还有几处会导致运行失败的问题:
find_contact函数里的length(s)是错误写法,Python中获取长度的函数是len(s)getmessage函数里的slpitline是拼写错误,应为splitline;且return语句位置错误,需放到if-else分支外部,否则只有else分支会返回值- 主循环里的
date,time,author,getmessage(line)是语法错误,应改为date, time, author, message = getmessage(line) getmessage里的message=''.join(splitline[1:])逻辑错误,应改为message=''.join(splitmessage[1:]),避免重复取整个分割内容wordcloud库的导入应为WordCloud(类名首字母大写)
完整修正后的代码
import re import pandas as pd import numpy as np import emojy from collections import Counter import matplotlib.pyplot as plt from PIL import Image from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator # 匹配日期时间格式 def date_time(s): pattern=r'^([0-9]{1,2})\/([0-9]{1,2})\/([0-9]{2,4}), ([0-9]{1,2}):([0-9]{2})\s?(AM|PM|am|pm)? -' result= re.match(pattern,s) return bool(result) # 判断是否包含联系人 def find_contact(s): s_split = s.split(':') return len(s_split) == 2 # 提取消息内容、日期、时间、联系人 def getmessage(line): splitline = line.split('-', 1) # 仅分割一次,避免消息中的-干扰 datetime_part = splitline[0].strip() date, time = datetime_part.split(', ', 1) message_content = splitline[1].strip() if find_contact(message_content): splitmessage = message_content.split(':', 1) author = splitmessage[0].strip() message = splitmessage[1].strip() else: author = None message = message_content return date, time, author, message data = [] filepath = r"C:\Users\91808\Downloads\Buddingchat.txt" with open(filepath, encoding='utf-8') as fp: fp.readline() # 跳过聊天记录标题行 messageBuffer = [] current_date, current_time, current_author = None, None, None while True: line = fp.readline() if not line: # 处理最后一条未缓存的消息 if len(messageBuffer) > 0: data.append([current_date, current_time, current_author, ''.join(messageBuffer)]) break line = line.strip() if date_time(line): if len(messageBuffer) > 0: data.append([current_date, current_time, current_author, ''.join(messageBuffer)]) messageBuffer.clear() current_date, current_time, current_author, message = getmessage(line) messageBuffer.append(message) else: messageBuffer.append(line)
内容的提问来源于stack exchange,提问作者Arya
相关产品推荐
相关产品推荐

