我想使用re.sub()
编写条件替换。基本上,如果在h_kw
集中找到它,我想在反引号(`)中附加一个单词。你可以告诉我我做错了什么,因为它总是在没有反引号的情况下打印,即使该单词存在于集合中。
>>>h_kw = set('COLLECTION','JOIN')
>>> def kw_correction(c_name,kw=h_kw):
... if c_name.upper() in kw:
... return "`"+c_name+"`"
... else:
... return c_name
...
>>>line = "select v['collection'] as test"
>>>test = re.sub(r"(v\[')(.*)('\])", kw_correction(r'\2'), line.rstrip())
>>> print (test)
select collection as test
答案 0 :(得分:0)
问题是你将\2
作为字符串传递给kw_correction而不是collection
然后返回\2
以便由正则表达式引擎解析,你可以看到如下: / p>
>>> def kw_correction(c_name,kw=h_kw):
print(kw,c_name)
if c_name.upper() in kw:
return "`"+c_name+"`"
else:
return c_name
>>> re.sub(r"(v\[')(.*)('\])", kw_correction(r'\2'), line.rstrip())
{'JOIN', 'COLLECTION'} \2
'select collection as test'
你需要将实际匹配传递给函数。
>>> re.sub(r"(v\[')(.*)('\])", kw_correction(re.search(r"(v\[')(.*)('\])",line.rstrip()).group(2)), line.rstrip())
{'JOIN', 'COLLECTION'} collection #this is still from the changed function above, take that line out for your code
'select `collection` as test'