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

Python正则匹配替换求助:匹配'onlin'后任意字符替换为Offline

问题分析与解决方案

你的代码失败的核心原因是:bytes.replace() 只支持固定字符串匹配,不支持正则表达式语法。你写的 b'Onlin\w{1}' 会被当成字面量去查找包含 Onlin\w{1} 的字节序列,而不是匹配 "Onlin" 后跟任意单个单词字符的内容。

修正后的代码方案

根据你的需求,我们需要用 Python 的 re 模块来实现正则替换,下面提供两种常见场景的写法:

场景1:响应内容是文本类型(如HTML/JSON/Plain Text)

import mitmproxy
import re

def response(flow):
    try:
        # 将字节内容解码为字符串(默认用utf-8,若响应是其他编码可调整,比如gbk)
        content = flow.response.content.decode('utf-8')
        # 正则替换:匹配"Onlin"后跟任意单个字符,替换为"Offline"
        # 若仅需匹配单词字符(字母/数字/下划线),把'.'换成'\w'即可
        # flags=re.IGNORECASE 用于忽略大小写,不需要可删除
        new_content = re.sub(r'Onlin.', 'Offline', content, flags=re.IGNORECASE)
        # 重新编码为字节并写回响应
        flow.response.content = new_content.encode('utf-8')
    except UnicodeDecodeError:
        # 若遇到无法解码的二进制内容,跳过处理
        pass

场景2:直接处理二进制内容

如果响应是二进制格式(或不确定编码),可以直接使用字节模式的正则:

import mitmproxy
import re

def response(flow):
    # 使用rb前缀定义字节正则,直接对响应字节内容做替换
    # 同样,把'.'换成'\w'可仅匹配单词字符
    new_content = re.sub(rb'Onlin.', b'Offline', flow.response.content, flags=re.IGNORECASE)
    flow.response.content = new_content

关键注意事项

  • re.sub() 是实现正则替换的正确方法,它支持正则表达式语法,而 str.replace()/bytes.replace() 仅支持固定字符串匹配。
  • 正则中的 . 匹配任意单个字符,如果你只想匹配字母、数字或下划线这类单词字符,替换成 \w 即可(即 r'Onlin\w' 或 rb'Onlin\w')。
  • flags=re.IGNORECASE 可以让匹配忽略大小写,比如同时匹配 "onlinX"、"OnlinY" 等情况,不需要的话可以去掉这个参数。
  • 如果响应是压缩格式(如gzip),mitmproxy 默认会自动解压响应内容,处理后会自动重新压缩,无需额外操作。

内容的提问来源于stack exchange,提问作者Matas Petkevičius

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:58:38