Python正则处理like/not like时出错,求解决方案
正则处理SQL like/not like时的错误修复
问题场景
基础版本处理单like语句正常:
import re text = "abc like '%FFddsdE%'" print("before: " + text) text = re.sub('([^ ^\n]+?) ?like ?\'([^ ]+)\'', lambda s: f'LOWER({s.group(1)}) like \'{s.group(2).lower()}\'', text, flags=re.I) print("after: " + text)
输出:
before: abc like '%FFddsdE%' after: LOWER(abc) like '%ffddsde%'
但扩展处理not like时出现异常,not被错误包裹进LOWER():
import re text = "abc not like '%FFddsdE%' and bcd like '%XyZ%'" print("before: " + text) text = re.sub('([^ ^\n]+?) ?not like ?\'([^ ]+)\'', lambda s: f'LOWER({s.group(1)}) not like \'{s.group(2).lower()}\'', text, flags=re.I) text = re.sub('([^ ^\n]+?) ?like ?\'([^ ]+)\'', lambda s: f'LOWER({s.group(1)}) like \'{s.group(2).lower()}\'', text, flags=re.I) print("after: " + text)
输出:
before: abc not like '%FFddsdE%' and bcd like '%XyZ%' after: LOWER(abc) LOWER(not) like '%ffddsde%' and LOWER(bcd) like '%xyz%'
错误原因
两次替换的逻辑冲突:第一次处理not like后,剩余的like会被第二个正则匹配,此时正则中的([^ ^\n]+?)会错误捕获not作为字段名,导致LOWER(not)的错误输出。同时原正则用[^ ]+匹配引号内容不够严谨,若引号内有空格会匹配失败。
解决办法
用单个正则匹配like和not like两种场景,通过可选分组捕获not关键字,一次替换完成处理:
import re text = "abc not like '%FFddsdE%' and bcd like '%XyZ%'" print("before: " + text) # 正则说明: # [^\s\n]+? 匹配字段名(匹配除空白/换行外的任意字符,非贪婪) # (not )? 可选分组,匹配是否存在not关键字 # '[^\']+' 精准匹配引号内的内容(避免空格导致的匹配中断) text = re.sub(r'([^\s\n]+?) ?(not )?like ?\'([^\']+)\'', lambda s: f'LOWER({s.group(1)}) {s.group(2) or ""}like \'{s.group(3).lower()}\'', text, flags=re.I) print("after: " + text)
输出:
before: abc not like '%FFddsdE%' and bcd like '%XyZ%' after: LOWER(abc) not like '%ffddsde%' and LOWER(bcd) like '%xyz%'
关键优化点
- 合并两种匹配场景,避免多次替换的冲突
- 用
[^\']+替代[^ ]+,确保引号内包含空格时也能正确匹配 - 非贪婪匹配字段名,避免过度捕获无关内容
内容的提问来源于stack exchange,提问作者Jiadong Chen
相关产品推荐
相关产品推荐

