Python用re.sub提取推文@用户时报sub()缺string参数如何解决
报错排查与修复方案
报错产生原因
- 核心参数错误:
re.compile生成的正则对象调用sub()方法时,要求至少传入2个位置参数,语法为正则对象.sub(替换内容, 待处理字符串),现有代码仅传入了待处理字符串text,缺少替换内容参数,因此触发missing required argument 'string'报错。 - 功能逻辑不匹配:需求为提取@开头的用户账号,
sub()是文本替换方法,无法实现提取功能,应该使用匹配提取方法findall()。 - 其他潜在问题:
- for循环前存在多余缩进,运行会触发语法错误
- 使用Python内置类型名
list作为变量名和函数参数名,会覆盖内置功能,易引发后续未知错误 - 正则编译写在for循环内部,每次迭代都会重复编译正则,浪费性能
修复方案
提取@用户账号的完整可运行代码
import re import statistics from statistics import mode # 提前编译正则,避免循环内重复编译 username_re = re.compile(r'@([A-Za-z0-9_]+)') # 避免与内置list重名,修改变量名 username_list = [] # 修正循环缩进 for text in df['text']: # 提取当前推文中所有@的用户账号 matched_users = username_re.findall(text) # 将匹配到的用户合并到总列表 username_list.extend(matched_users) def most_repeated(data_list): # 增加空列表判断,避免mode方法报错 if not data_list: return None return mode(data_list) # 输出所有提取到的@用户 print(username_list) # 输出出现次数最多的用户 print("提及次数最多的用户:", most_repeated(username_list))
若实际需求为删除推文中的@用户(即确实需要使用sub方法),对应修正写法为:
# 第一个参数为替换成的空字符串,第二个参数为待处理文本 clean_text = username_re.sub('', text)
内容的提问来源于stack exchange,提问作者Ruth Lulu
相关产品推荐
相关产品推荐

