Python判断AWS bucket名部分匹配排除列表时代码失效如何解决
代码问题分析
- 核心问题:
re.match()方法的匹配规则不符合「任意位置部分匹配」的需求。re.match()只会从桶名字符串的开头位置进行匹配,例如排除项为aws-config时,桶名prod-aws-config-log无法被re.match()匹配到,自然不会被跳过。 - 次要问题:判断写法冗余。
bool(re.match(exclusion_items, bucket_name)) == True无需额外做布尔转换再和True比较,可直接判断匹配结果。 - 可选优化点:如果排除列表内都是普通字符串,没有正则匹配需求,完全不需要引入正则库,直接用Python原生
in运算符做子串判断性能更高,也不会出现正则特殊字符转义的问题。
修正方案1:无需正则,直接做子串判断(推荐)
def valid_bucket(bucket_name): bucket_exclusion_list = ['do-not-delete', 'aws-config', 'elasticbeanstalk'] for exclusion_item in bucket_exclusion_list: # 任意位置匹配到子串就返回False跳过 if exclusion_item in bucket_name: return False return True
该方案不需要导入re模块,不会遇到排除项包含.、*、?等正则特殊字符导致的匹配异常,运行效率更高。
修正方案2:如果确实需要正则匹配规则,用re.search替代re.match
import re def valid_bucket(bucket_name): bucket_exclusion_list = ['do-not-delete', 'aws-config', 'elasticbeanstalk'] for exclusion_item in bucket_exclusion_list: # re.search会扫描整个字符串,任意位置匹配到就返回结果 # 如果排除项含正则特殊字符,需要改为re.search(re.escape(exclusion_item), bucket_name)做转义 if re.search(exclusion_item, bucket_name): return False return True
内容的提问来源于stack exchange,提问作者abhinav singh
相关产品推荐
相关产品推荐

