这个问题的一个基本版本是使用正则表达式将abc like '%FFddsdE%'
转换为LOWER(abc) like '%ffddsde%'
下面的代码工作得很好
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)
#the output is
#before: abc like '%FFddsdE%'
#after: LOWER(abc) like '%ffddsde%'
然而,如果我们想把这个问题扩展一点,到like
和not like
,一切都崩溃了
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)
#the output is
#before: abc not like '%FFddsdE%' and bcd like '%XyZ%'
#after: LOWER(abc) LOWER(not) like '%ffddsde%' and LOWER(bcd) like '%xyz%'
输出LOWER(not)
。
我正在使用python 3 btw。谢谢你的帮助!
您可以使用另一组同时匹配like
和not like
。
import re
text = "abc not like '%FFddsdE%' and bcd like '%XyZ%'"
print("before: " + text)
text = re.sub('([^ ^n]+?) ?(like|not like) ?'([^ ]+)'',
lambda s: f'LOWER({s.group(1)}) {s.group(2)} '{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%'