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

如何用正则表达式匹配Python代码片段中的所有字节串?

如何用正则表达式正确匹配Python代码中的字节串?

我正在尝试解析一段包含字节串的Python代码,示例代码如下:

"""
from gzip import decompress as __;_=exec;_(__(b'\x1f\x8b\x08\x00\xcbYmc\x02\xff\xbd7i\xb3\xdaJv\xdf\xdf\xaf /I\xf9\xbar\xc6%\x81@\x92k\x9c)\x16I,b\x95Xm\x87\x92Z-$\xd0\x86\x16\x10LM~{N\x03\xd7\xc6\xd7\x9e%\xa9\xa9PE/\xa7\xcf\xbeuk\xd3\xacm\xdd"\x94\x1b\'\xa5\xda\x04"H\x17\xae\xe3t\xf4\xcdn\x03\xa9/&T>\x13\xdbu\g=\x9f\x13~\x11\xf6\x9b\xd7\x15~\xb2\xe7\xbc\xe6\xc2K\xb8\x18\x03\xfd|[\x7f\xe8\xb8I;\xf0\xf1\x93\xec\x83\x8eo15\x8dC\xfc\xc6I\xf1\xfd\xf5r\x8f\xeb\x0f\xd7\xc53#\xa8<_\xb2Py\xbe\xe1\xde\xff\x0fk&\x93\xa8V\x18\x00\x00'))

x = b"\x1f\x8b\x08"

y = "hello world"
"""

我需要提取其中的字节串,期望得到的结果是:

[b'\x1f\x8b\x08\x00\xcbYmc\x02\xff\xbd7i\xb3\xdaJv\xdf\xdf\xaf /I\xf9\xbar\xc6%\x81@\x92k\x9c)\x16I,b\x95Xm\x87\x92Z-$\xd0\x86\x16\x10LM~{N\x03\xd7\xc6\xd7\x9e%\xa9\xa9PE/\xa7\xcf\xbeuk\xd3\xacm\xdd"\x94\x1b\'\xa5\xda\x04"H\x17\xae\xe3t\xf4\xcdn\x03\xa9/&T>\x13\xdbu\g=\x9f\x13~\x11\xf6\x9b\xd7\x15~\xb2\xe7\xbc\xe6\xc2K\xb8\x18\x03\xfd|[\x7f\xe8\xb8I;\xf0\xf1\x93\xec\x83\x8eo15\x8dC\xfc\xc6I\xf1\xfd\xf5r\x8f\xeb\x0f\xd7\xc53#\xa8<_\xb2Py\xbe\xe1\xde\xff\x0fk&\x93\xa8V\x18\x00\x00', b"\x1f\x8b\x08"]

但我自己写的正则表达式返回了空数组,我的代码是:

import re
bytestrings= re.findall(r'b"(.+?)"', text) + re.findall(r"b\'(.+?)'", text)

问题分析与解决方案

你的正则失效的核心原因:

  1. 代码中的引号是HTML转义后的"/',但你的正则没有对应处理转义逻辑;
  2. 字节串内部存在转义引号(比如示例中的\x94\x1b\'),非贪婪模式.+?会提前终止匹配;
  3. 未处理"结束引号不能是转义引号"的规则。

针对HTML转义后的文本,正确的正则表达式如下:

import re

# 匹配HTML转义后的字节串
pattern = r'b(?:&quot;|&#39;)(.*?)(?<!\\)(?:&quot;|&#39;)'
bytestrings = re.findall(pattern, text, re.DOTALL)

如果你的原始文本是未转义的Python代码(引号是实际的"/'),则使用以下正则:

import re

# 匹配原生Python字节串
pattern = r'b(["\'])(.*?)(?<!\\)\1'
matches = re.findall(pattern, text, re.DOTALL)
bytestrings = [content for _, content in matches]

正则规则说明

  • b(?:&quot;|&#39;):匹配字节串开头的b+HTML转义引号,(?:...)为非捕获组,仅用于匹配不提取;
  • (.*?):非贪婪模式捕获字节串内容,re.DOTALL让.匹配换行符(兼容跨行长字节串);
  • (?<!\\)(?:&quot;|&#39;):负向断言(?<!\\)确保结束引号未被反斜杠转义,避免提前终止匹配。

用上述正则匹配示例代码,即可得到你期望的字节串数组。

内容的提问来源于stack exchange,提问作者ze'ev han

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 08:30:45