如何用正则表达式匹配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)
问题分析与解决方案
你的正则失效的核心原因:
- 代码中的引号是HTML转义后的
"/',但你的正则没有对应处理转义逻辑; - 字节串内部存在转义引号(比如示例中的
\x94\x1b\'),非贪婪模式.+?会提前终止匹配; - 未处理"结束引号不能是转义引号"的规则。
针对HTML转义后的文本,正确的正则表达式如下:
import re # 匹配HTML转义后的字节串 pattern = r'b(?:"|')(.*?)(?<!\\)(?:"|')' 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(?:"|'):匹配字节串开头的b+HTML转义引号,(?:...)为非捕获组,仅用于匹配不提取;(.*?):非贪婪模式捕获字节串内容,re.DOTALL让.匹配换行符(兼容跨行长字节串);(?<!\\)(?:"|'):负向断言(?<!\\)确保结束引号未被反斜杠转义,避免提前终止匹配。
用上述正则匹配示例代码,即可得到你期望的字节串数组。
内容的提问来源于stack exchange,提问作者ze'ev han
相关产品推荐
相关产品推荐

