2016-11-08 185 views
1

我想用python来浏览一个文本文件,并用“0.0”替换包含子串“e-”的所有字符串。如何替换包含python中特定字符的字符串?

例如,在该行:

0.46790 0.25440 3.5637e-0 0.0082447 0.0016506 0.00018180 -99 0.0010338 0.00067166 0.0043598

“3.5637e-0” 将由0.0代替。围绕“e-”的数字在每次出现时不一定相同。

如果可能的话,我想修改下面的代码(其中“ - ”被通过“-99”代替)要做到这一点,但我接受其他的建议,以及:

with open(outputfile, "wt") as fout: 
    with open(datafile, "rt") as fin: 
     for line in fin: 
      fout.write(line.replace('- ', '-99 ')) 

回答

3

我行拆分,替换包含“e通”与“0.0”的任何元素,并重新加入:

fout.write(' '.join(['0.0' if 'e-' in x else x for x in line.split(' ')])) 
0

在最后一行之前添加以下两行。

contents = [x.replace("e-", '0.0') for x in line.split()] 
fout.write(' '.join(contents) + '\n') 

这里做的事情是,它分裂line每当空间得到满足,并在每一块应用replace方法。这里我们利用了replace这个事实,即使我们正在寻找的子字符串不在字符串中,也是有效的。修改完该行后,我们将它重新拼接在一起,追加一个换行符并将其写入文件。

0

你也可以使用一个regular expression,虽然它可能在这种情况下是矫枉过正。

import re 

fout.write(re.sub(r"[\d.]+e-\d+", "0.0", line)) 
1

我的建议是使用正则表达式模块中类似的方式:

import re 
import sys 

def process_file(src, dst=sys.stdout): 
    for line in src: 
     dst.write(re.sub("\d+\.\d+e\-\d+", "0.0", line)) 

def main(paths): 
    for path in paths: 
     with open(path, "rb") as fp: 
      process_file(fp) 

if __name__ == "__main__": 
    sys.exit(main(sys.argv[1:])) 

如果我创建一个包含以下内容

0.46790 0.25440 3.5637e-0 0.0082447 0.0016506 0.00018180 -99 0.0010338 0.00067166 0.0043598 
0.46790 0.25440 3.5637e-0 0.0082447 0.0016506 0.00018180 -99 0.0010338 0.00067166 0.0043598 

并运行程序文件(称为example.py)如下

$ python example.py test.txt test.txt 

我得到以下输出

0.46790 0.25440 0.0 0.0082447 0.0016506 0.00018180 -99 0.0010338 0.00067166 0.0043598 
0.46790 0.25440 0.0 0.0082447 0.0016506 0.00018180 -99 0.0010338 0.00067166 0.0043598 

0.46790 0.25440 0.0 0.0082447 0.0016506 0.00018180 -99 0.0010338 0.00067166 0.0043598 
0.46790 0.25440 0.0 0.0082447 0.0016506 0.00018180 -99 0.0010338 0.00067166 0.0043598 

你可以调整计划,以满足您的特定需求。

相关问题