如何实现字符串与含%通配符列表的非匹配校验?
问题与代码修正
需求说明
给定列表 newlist = ['test', '%ing', 'osh', '16fg'] 和目标字符串 tartext = 'Singing',需校验目标字符串是否与列表中所有元素都不匹配:
- 普通元素执行等值匹配
- 含
%的元素按SQL通配符规则处理(%匹配任意长度的任意字符) - 返回规则:目标字符串不匹配列表中任何元素时返回
True;只要匹配其中一个元素,就返回False - 示例:
Singing匹配%ing,应返回False
原代码问题
原代码逻辑完全颠倒,且循环过早返回:
- 原逻辑中,只要遇到一个不匹配的元素就直接返回
True,与需求完全相反 - 没有正确实现「只要匹配任一元素就返回False」的核心逻辑
修正后的代码
import re newlist = ['test', '%ing', 'osh', '16fg'] tartext = 'Singing' def wildcard_compare(string, match): # 将SQL%通配符转换为正则表达式的.*,匹配整个字符串 match_pattern = match.replace('%', '.*') return bool(re.fullmatch(match_pattern, string)) def condition_match(lookupstring, mylist): for value in mylist: if '%' in value: if wildcard_compare(lookupstring, value): # 匹配到通配符规则,直接返回False return False else: if value == lookupstring: # 等值匹配成功,直接返回False return False # 遍历完所有元素均无匹配,返回True return True # 测试用例 print(condition_match(tartext, newlist)) # 输出:False(Singing匹配%ing) print(condition_match('BO_IN', ['AP_IN','BO_IN','CA_PS'])) # 输出:False(BO_IN在列表中) print(condition_match('Unknown', newlist)) # 输出:True(无匹配项)
修正要点
- 调整核心逻辑:遍历列表时,只要找到匹配项就立即返回False
- 仅当所有元素都不匹配时,才返回True
- 保留正确的通配符转正则逻辑,确保
%ing能匹配任意以ing结尾的字符串
内容的提问来源于stack exchange,提问作者Roshan
相关产品推荐
相关产品推荐

