You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python将类Bash通配符转换为SQL过滤条件?

解决方案

用Python标准库fnmatch实现转换

Python自带的fnmatch模块专门处理类Bash的通配符逻辑,它的translate方法能直接将shell通配符转为正则表达式,我们只需要在此基础上调整为SQL LIKE语法即可,完全覆盖转义字符、方括号匹配等边界情况,无需额外安装依赖。

示例代码:

import fnmatch

def shell_wildcard_to_sql_like(pattern):
    # 将shell通配符转为正则表达式
    regex_str = fnmatch.translate(pattern)
    # 移除正则的首尾锚点(SQL LIKE不需要严格匹配首尾)
    like_str = regex_str.lstrip('^').rstrip('$')
    # 映射正则通配符到SQL LIKE语法
    like_str = like_str.replace('.*', '%')  # * 对应 SQL 的 %
    like_str = like_str.replace('.', '_')   # ? 对应 SQL 的 _
    # 方括号匹配直接保留(部分数据库原生支持LIKE中的方括号,若不支持可额外处理)
    return like_str

使用示例:

  • 输入a* → 输出a%,直接用于User.uid.like(shell_wildcard_to_sql_like('a*'))
  • 输入a? → 输出a_
  • 输入a[bc]d → 输出a[bc]d

关键注意事项

调用命令行程序时,必须用引号包裹通配符参数(比如myprog users list 'a*'),否则Bash会自动将a*展开为当前目录下的匹配文件名,导致程序接收到的不是原始通配符字符串。

极简实现(仅支持*和?)

如果只需要处理*和?两种基础通配符,且无需处理转义或方括号,可以直接做字符串替换,但要先转义SQL的特殊字符:

def simple_wildcard_to_like(pattern):
    # 先转义SQL LIKE的特殊字符%和_
    escaped = pattern.replace('%', r'\%').replace('_', r'\_')
    # 替换shell通配符
    return escaped.replace('*', '%').replace('?', '_')

这种方式适合场景简单的情况,但无法处理转义的通配符(比如a\*)和方括号匹配,健壮性不如fnmatch。

内容的提问来源于stack exchange,提问作者loris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 02:50:40