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'
感谢您的快速回复。 – user5517619