如何只替换文件中的某些单词

时间:2014-04-01 04:52:52

标签: python python-2.7

该程序用于检查两个特定单词(例如:'ஒன்று'和'கோடி')是否连续出现,如果是,则用特定单词替换第一个单词(例如:'ஒரு')。我必须从文件中读取内容并将其写入另一个文件。我使用了一个标志变量,从2初始化,并且仅在标志%2 == 0时打印到文件中,因此这些单词不会重复到新文件中。 pgm仅在单词位于偶数位置时起作用,否则不起作用。我该如何更改检查和打印。这是代码:

filename = raw_input("enter file:")
ff = open(filename+'.rep_out','w')
with open(filename, 'r') as f: 
    for line in f:
        words = line.strip().split() 
        flag = 2
        for word1, word2 in zip(words, words[1:]): 
            if flag%2 == 0:
                if word1 == 'ஒன்று' or word1 == '1':
                    if word2 == 'கோடி'  or word2 == 'லட்சம்' or word2 == 'ஆயிரம்' :
                        #word1=word1.replace(word1,'ஒரு')
                        word1='ஒரு'
                        #ff.write(word1+" ")
                ff.write(word1+" ")
                ff.write(word2+" ")             
            flag=flag+1
f.close()
ff.close()  

1 个答案:

答案 0 :(得分:1)

当你的字符串操作变得复杂时,你可以用比Python的字符串方法更强大的工具做得更好。在这种情况下,使用正则表达式要容易得多:

import re

with open(filename) as f:
   with open(filename + '.rep_out') as ff:
       for line in f:
          ff.write(re.sub("ஒன்று (கோடி|லட்சம்|ஆயிரம்)", r"ஒரு \1", line))

说明:

正则表达式"ஒன்று (கோடி|லட்சம்|ஆயிரம்)"匹配任何出现的ஒன்று,然后连续出现任何கோடி,லட்சம்或ஆயிரம்-您可以根据需要将其扩展到尽可能多的候选第二个单词。

re.sub用替换的第一个单词(ஒரு)替换它,然后是它之前找到的相同的第二个单词 - \ 1告诉它"把那个位置匹配第一组()回到这里" (那就是为什么它需要是一个原始字符串 - 你希望由re.sub解析,而不是由Python的字符串文字规则解析)。

如上所述,上面的代码假设每行上的单词只用一个空格分隔,这与原始代码不同,允许它们被任意数量的空格分隔,但是输出它们被一个空格隔开。要匹配该行为,您可以像这样修改上面的正则表达式:

 re.sub("ஒன்று\s+(கோடி|லட்சம்|ஆயிரம்)", r"ஒரு \1", line)

\ s匹配任何空格字符,+表示"匹配连续的多个字符,只要至少有一个"。

请注意,当您使用with open(...) as f:时,之后不需要致电f.close() - 这会在您退出with阻止时自动发生。