You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何让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

火山引擎 最新活动