Python re.sub()未按预期工作

问题描述:

我想使用re.sub()编写条件替换。基本上,如果在h_kw集合中找到它,我想在反引号(`)中附上一个单词。你能否告诉我我做错了什么,因为它总是打印时没有反引号,即使这个词出现在这个集合中。Python re.sub()未按预期工作

>>>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 

的问题是要传递\2作为字符串到kw_correction,不collection然后返回\2由正则表达式引擎解析,你可以看到如下:

>>> 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' 
+0

感谢您的快速回复。 – user5517619