如何改写传给filter的lambda函数,使其支持传入正则表达式参数?
解决方案
你需要把filterf改成高阶函数——也就是能接收正则参数,并返回一个符合filter要求的判断函数的函数。有两种常见写法:
写法一:嵌套Lambda
直接用嵌套lambda实现,代码简洁:
import re filterf = lambda pattern: lambda s: re.match(pattern, s) print("".join(list(filter(filterf(r'^T'), ["T x", "M y"])))) # outputs: T x
写法二:带正则编译的函数(推荐)
如果需要多次使用这个判断逻辑,提前编译正则能提升性能,用普通函数定义更清晰:
import re def filterf(pattern): # 提前编译正则,避免重复编译 regex = re.compile(pattern) return lambda s: regex.match(s) print("".join(list(filter(filterf(r'^T'), ["T x", "M y"])))) # outputs: T x
原理说明
原来的filterf是直接接收字符串s并判断的函数,现在改成:
- 先接收正则表达式
pattern作为参数 - 返回一个新的函数,这个新函数才是
filter实际调用的判断函数,它会用传入的正则去匹配输入的字符串s
这样调用filterf(r'^T')时,就会生成一个和原代码中lambda s:re.match(r'^T', s)功能完全一致的函数,刚好满足filter的参数要求。
内容的提问来源于stack exchange,提问作者Chris JJ
相关产品推荐
相关产品推荐

