繁体   English   中英

在python中搜索并替换多个字符串

[英]Search and replace multiple string in python

这是我的代码,我想搜索并替换三个字符串

tmp="/tmp"
day = datetime.date.today().day
today = datetime.date.today()
year =datetime.date.today().year
month = today.strftime('%b')

f1 = open("%s/backup.txt" % (tmp), 'r')
f2 = open("%s/backup1.txt" % (tmp), 'w')
for line in f1:
      f2.write(line.replace('day',  "%s" % (day)))
f1.close()
f2.close()

f1 = open("%s/backup1.txt" % (tmp), 'r')
f2 = open("%s/backup2.txt" % (tmp), 'w')
for line in f1:
      f2.write(line.replace('mon',  "%s" % (mon)))
f1.close()
f2.close()

f1 = open("%s/backup2.txt" % (tmp), 'r')
f2 = open("%s/backup3.txt" % (tmp), 'w')
for line in f1:
      f2.write(line.replace('year',  "%s" % (year)))
f1.close()
f2.close()

无论如何一次完成并通过降低LOC来做到这一点?

我想一次性查找和替换年,周一和日。

您可以在将循环写入新文件之前 ,在同一循环中进行三个替换。

f1 = open("%s/backup.txt" % (tmp), 'r')
f2 = open("%s/backup1.txt" % (tmp), 'w')
for line in f1:
    new_line = line.replace('day',  "%s" % (day))
    new_line = line.replace('mon',  "%s" % (mon))
    new_line = line.replace('year',  "%s" % (year))
    f2.write(new_line)
f1.close()
f2.close()

如果愿意,您甚至可以在同一行上执行所有这三个操作,尽管该行会很长,并且无论如何都应该用\\断开。 另外,您可以(并且应该) with一起使用以打开和关闭文件。

with open("%s/backup.txt"  % tmp, 'r') as f1, \
     open("%s/backup1.txt" % tmp, 'w') as f2:
    for line in f1:
        new_line = line.replace('day',  "%s" % day) \
                       .replace('mon',  "%s" % mon) \
                       .replace('year', "%s" % year)
        f2.write(new_line)

@bruno的想法为基础 ,您还可以创建带有替换内容的字典,然后使用正则表达式查找“ day”或“ mon”或“ year” "day|mon|year" ,并将其替换为字典中的值。

>>> day, mon, year = 2017, 5, 15
>>> repl = {"day": day, "mon": mon, "year": year}
>>> line = "test string with day, mon, and year in it"
>>> re.sub("day|mon|year", lambda m: str(repl.get(m.group())), line)
'test string with 2017, 5, and 15 in it'

更好的是:如果您可以控制模板文件,则可以将要替换的部分包装到{...} ,然后使用str.format进行替换(假设{...}不会出现在文件)。

>>> line = "test string with {day}, {mon}, and {year} in it"
>>> line.format(**repl)
'test string with 2017, 5, and 15 in it'
tmp="/tmp"
today = datetime.date.today()
day = "%s" % today.day
year = "%s" % today.year
month = today.strftime('%b')

replacements = [
    # find -> replace
    ('day', day),
    ('mon', mon),
    ('year', year)
    ]


with open("%s/backup.txt" % (tmp), 'r') as source, \
   open("%s/backup1.txt" % (tmp), 'w') as dest:

    for line in source:
        for target, replacement in replacements:
            line = line.replace(target, replacement) 
      dest.write(line)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM