python debug:替换两个未知子串之间的字符串

时间:2012-09-05 04:05:49

标签: python replace

这是我下面的python脚本,我尝试使用sub()替换<StartNum></StartNum>之间的所有值,使用变量连续数n然后,写结果到一个新的文本文件。 任何人都可以指出错误吗?

import re
f1 = open('name.xml', 'r')
f2 = open('result.txt', 'w')
data=f1.read()
n=5000
for line in f1:
      f2.write(re.sub('<StartNum>(.*)</StartNum>', r'<StartNum>%s</StartNum>' % str(n), data))
      if "<StartNum>" in line:
          n=n+1
f1.close() 
f2.close()

1 个答案:

答案 0 :(得分:1)

您的代码存在一些问题。

  1. 您正在将文件f1读入数据,但是您继续使用f1进行循环。阅读完数据后,即可关闭该文件。
  2. 你可能想要分割线。你可以通过多种方式实现这一目标。 readlines方法可能是最直接的方法。
  3. 当您在循环中评估正则表达式时,它可能非常慢,因为每次迭代都必须重新编译它。相反,您可以提前编译正则表达式并使用它。
  4. 在您的re.sub中,您使用的是data作为来源,而您确实需要该行。
  5. 您可以采取其他措施来改进代码,但上面列出的代码非常必要。

    我猜这可能会做你想要的。

    import re
    f1 = open('name.xml', 'r')
    f2 = open('result.txt', 'w')
    data = f1.readlines()
    f1.close()
    n = 5000
    rex = re.compile('<StartNum>(.*)</StartNum>')
    for line in data:
        f2.write(rex.sub(r'<StartNum>%s</StartNum>' % str(n), line))
        if "<StartNum>" in line:
            n += 1
    f2.close()
    

    给出

    的names.xml
    <root>
        <StartNum>1</StartNum>
        <StartNum>5</StartNum>
        <StartNum>8</StartNum>
        <StartNum>9</StartNum>
        <StartNum>13</StartNum>
        <StartNum>33</StartNum>
        <foo>
            <bar baz="5" />
        </foo>
    </root>
    

    result.txt将是:

    <root>
        <StartNum>5000</StartNum>
        <StartNum>5001</StartNum>
        <StartNum>5002</StartNum>
        <StartNum>5003</StartNum>
        <StartNum>5004</StartNum>
        <StartNum>5005</StartNum>
        <foo>
            <bar baz="5" />
        </foo>
    </root>