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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 04:36:15