如何在re.sub中将变量指定为第一个参数

时间:2019-04-13 20:27:49

标签: python regex python-2.7

我只是最近才开始使用python,之前从未写过任何代码。我使用了一个正则表达式来匹配输入文件中的字符串(成功了),但是我真的在努力寻找一种使用正则表达式将文件中的字符串替换为另一个字符串的方法。

with open( fileToSearch, "r+" ) as file:
for line in fileinput.input( fileToSearch ):
    string4=line
    result1 = re.search(r'(KNOWLEDGECENTER\/.*?\/)' + re.escape(taxonomy), string4)
    print (result1)
    result2 = re.sub(result1, r'(KNOWLEDGECENTER\/\t(\1)\/\)' + taxonomy, string4)
    print (result2)
    file.write(result2)  

我希望re.sub将替换字符串中的result1变量中的字符串替换,但是,我得到了以下错误:

引发TypeError,“第一个参数必须为字符串或编译模式” TypeError:第一个参数必须是字符串或已编译的模式

如果将result1变量放在re.sub语句中的引号中,如下所示,则不会出现错误,但是输入文件不会使用替换字符串进行更新

result2 = re.sub('result1', r'(KNOWLEDGECENTER\/\t(\1)\/\)' +  
taxonomy, string4)

re.search代码似乎可以在打印(result1)返回时工作:对于输入文件中的每一行,<_sre.SRE_Match对象位于0x02A120E0>

2 个答案:

答案 0 :(得分:0)

search返回具有各种与正则表达式匹配相关的属性的对象(MatchObject),而不是字符串或编译后的模式,因此会出错。也许您想要的是re.sub(results1.group(0), ...)

(顺便说一下,您将python 2.7作为关键字。如果您使用的是该版本,请考虑升级到python 3)

答案 1 :(得分:0)

由于re.sub本身可以执行搜索,因此您不需要单独调用re.search。实际上,您在结果匹配中对re.search的调用会丢失正则表达式中的捕获组,因此对re.sub的调用中替换字符串中的反向引用将无法引用任何内容。合并到两个调用中,它将起作用(以下示例代码假定您要做的就是在KNOWLEDGECENTER/之后添加一个标签页:

for line in fileinput.input(fileToSearch):
    result = re.sub('(KNOWLEDGECENTER/)(.*?/' + re.escape(taxonomy) + ')', r'\1\t\2', line)
    file.write(result)