如何让Python的if语句实现SQL中LIKE的模糊匹配特性?
优化Python条件判断,实现SQL LIKE式模糊匹配
嘿,看你这段FindLabel函数里一堆重复的elif精确匹配,确实挺冗余的!要实现类似SQL LIKE的模糊匹配来简化代码,Python里有几种实用的方法,完全能满足你的需求,我给你拆解一下:
1. 简单模糊匹配:用字符串内置方法
SQL里的LIKE常用的%通配符,对应Python里的几种字符串操作:
%xxx%→ 用'xxx' in 字符串判断是否包含指定内容xxx%→ 用字符串.startswith('xxx')判断是否以指定内容开头%xxx→ 用字符串.endswith('xxx')判断是否以指定内容结尾
针对你代码里的场景——所有匹配的OWNER都是以PELT 开头的,直接用startswith就能把一堆elif合并成一个条件,代码瞬间简洁:
def FindLabel([Area_wl], [OWNER], [APN]): # 匹配所有以'PELT '开头的OWNER(等价于SQL LIKE 'PELT %') if [OWNER].startswith('PELT '): return "<CLR red='255'><FNT size='7'>" + [OWNER] + "\n" + [APN] + "</FNT></CLR>" # 如果还有其他匹配规则,继续加条件即可 # 比如匹配包含'SMITH'的OWNER: elif 'SMITH' in [OWNER]: return "<CLR blue='255'><FNT size='7'>" + [OWNER] + "\n" + [APN] + "</FNT></CLR>" # 默认返回格式(按需调整) else: return f"{[OWNER]}\n{[APN]}"
2. 复杂模糊匹配:用正则表达式
如果需要更灵活的匹配规则(比如类似SQL里的%KENNETH%D这种多通配符场景),Python的re模块就能完美实现,它比字符串内置方法更强大:
import re def FindLabel([Area_wl], [OWNER], [APN]): # 匹配OWNER中包含'KENNETH'或'PAMELA'的(等价于SQL LIKE '%KENNETH%' OR '%PAMELA%') if re.search(r'KENNETH|PAMELA', [OWNER]): return "<CLR red='255'><FNT size='7'>" + [OWNER] + "\n" + [APN] + "</FNT></CLR>" # 匹配以'PELT'开头且以'D'结尾的(等价于SQL LIKE 'PELT %D') elif re.match(r'PELT .*D$', [OWNER]): return "<CLR green='255'><FNT size='7'>" + [OWNER] + "\n" + [APN] + "</FNT></CLR>" # 默认返回 else: return f"{[OWNER]}\n{[APN]}"
3. 可维护性优化:把匹配规则抽离成列表
如果以后要添加更多匹配项,建议把所有规则整理成一个列表,循环判断即可,不用每次修改函数逻辑:
import re def FindLabel([Area_wl], [OWNER], [APN]): # 定义匹配规则列表,支持精确匹配(字符串)或正则(正则表达式) match_rules = [ r'^PELT KENNETH D$', # 精确匹配(等价于==) r'^PELT PAMELA KAY$', r'^PELT JONATHAN VAN$', r'^SMITH.*' # 以SMITH开头的模糊匹配 ] for rule in match_rules: if re.fullmatch(rule, [OWNER]): return "<CLR red='255'><FNT size='7'>" + [OWNER] + "\n" + [APN] + "</FNT></CLR>" # 默认返回 return f"{[OWNER]}\n{[APN]}"
这样后续要加新的匹配规则,只需要在match_rules里添加就行,代码结构更清晰,维护起来也方便。
内容的提问来源于stack exchange,提问作者Winne Loo




