regex 查找python代码段中出现的所有字节串

gdx19jrr  于 2022-11-18  发布在  Python
关注(0)|答案(1)|浏览(98)

我正在尝试解析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"
"""

是否有正则表达式模式可以用来正确查找这些字符串?
我自己尝试过实现一个regex查询,如下所示:

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

我本来希望收到一个数组

[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"]

而是返回一个空数组。

wfveoks0

wfveoks01#

这不是正则表达式的工作,而是Python解析器的工作。

import ast

code = """
...
"""

tree = ast.parse(code)

现在你可以遍历树,寻找ast.Constant类型的值,这些值的value属性具有bytes类型。通过定义ast.NodeVisitor的子类并覆盖它的visit_Constant方法来实现这一点。这个方法将在树中ast.Constant类型的每个节点上被调用,让你可以检查值。这里,我们只是将适当的值添加到一个全局列表中。

bytes_literals = []

class BytesLiteralCollector(ast.NodeVisitor):
    def visit_Constant(self, node):
        if isinstance(node.value, bytes):
            bytes_literals.append(node.value)

BytesLiteralCollector().visit(tree)

关于NodeVisitor的文档并不是很好。除了两个已记录的方法visitgeneric_visit之外,我相信您可以定义visit_*,其中*可以是在文档开头的抽象语法中定义的任何节点类型。
您可以使用print(ast.dump(ast.parse(code), indent=4))来获得访问者将要遍历的树的可读表示形式。

相关问题