如何用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
相关产品推荐
相关产品推荐

