You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python用re.sub提取推文@用户时报sub()缺string参数如何解决

报错排查与修复方案

报错产生原因

  1. 核心参数错误:re.compile生成的正则对象调用sub()方法时,要求至少传入2个位置参数,语法为正则对象.sub(替换内容, 待处理字符串),现有代码仅传入了待处理字符串text,缺少替换内容参数,因此触发missing required argument 'string'报错。
  2. 功能逻辑不匹配:需求为提取@开头的用户账号,sub()是文本替换方法,无法实现提取功能,应该使用匹配提取方法findall()。
  3. 其他潜在问题:
    • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 22:54:10