【问题标题】:How can I specify a variable as the first argument in re.sub如何将变量指定为 re.sub 中的第一个参数
【发布时间】:2019-04-13 20:27:48
【问题描述】:

我最近才开始使用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: 第一个参数必须是字符串或编译模式

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

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

re.search 代码似乎在 print (result1) 返回时起作用:<_sre.sre_match object at> 用于输入文件中的每一行

【问题讨论】:

    标签: python regex python-2.7


    【解决方案1】:

    由于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)
    

    【讨论】:

      【解决方案2】:

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

      (顺便说一句,你有 python 2.7 作为关键字。如果这是你正在使用的版本,请考虑升级到 python 3)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-28
        • 1970-01-01
        • 1970-01-01
        • 2018-06-09
        相关资源
        最近更新 更多