Python re.sub()没有按预期工作

时间:2015-11-02 22:04:25

标签: python

我想使用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

1 个答案:

答案 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'