今天搓一个sage脚本遇到一个很无语的问题,经过调试,发现是pwntools库中的findall方法和re库中的findall方法重名导致的。这两个findall方法的用法完全不一样,稍有不慎就会踩坑。
文章目录
- 区分
- 问题引发
- 如何规避
区分
re 是 Python 中用于处理正则表达式的内置模块,findall 是 re 模块中的一个函数,用于在输入的字符串中查找所有匹配指定模式的子串,并以列表的形式返回这些子串。例如:
from re import findall
result = findall(r'\d+', '12 drummers drumming, 11 pipers piping, 10 lords a-leaping')
print(result) # 输出: ['12', '11', '10']
在这个例子中,findall 函数使用正则表达式 \d+ 在输入的字符串中查找所有的数字,并返回一个包含所有匹配数字的列表。
在pwntools中的findall方法,主要使用KMP算法来获取一个数组中某个元素的所有下标。
def findall(haystack, needle):
"""findall(l, e) -> l
Generate all indices of needle in haystack, using the
Knuth-Morris-Pratt algorithm.
Example:
>>> foo = findall([1,2,3,4,4,3,4,2,1], 4)
>>> next(foo)
3
>>> next(foo)
4
>>> next(foo)
6
>>> list(foo) # no more appearances
[]
>>> list(findall("aaabaaabc", "aab"))
[1, 5]
"""
问题引发
如果在python的IDE中,如pycharm,那么写代码的时候就容易发现这个问题。但是如果在sage中,没有明显的语法提示,很容易就出现这个问题。
如果你使用了from pwn import *
,且from re import findall
导入语句在其之前,那么就会使用pwntools中的findall方法。
令人火恼的是,不会报语法错误,而是不经意间结果错了,需要你仔细调试才能发现这个问题!!!不经意间你的时间就被浪费了。
如何规避
- 尽量不要使用
from xxx import *
,用什么方法在后面详细写出来。 - 如果要使用类似
from xxx import *
的语句,将其放到最前面,这样后面的import会将里面的方法覆盖掉。
ATFWUS 2024-01-23