2014-04-01 156 views
2

该程序用于检查两个特定单词(如:'ஒன்று'和'கோடி')是否连续出现,如果是这样,请用特定单词替换第一个单词(例如:'ஒரு “)。我必须从文件中读取内容并将它们写入另一个文件中。我已经使用了一个标志变量,从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() 
+0

'ஒருஆயிரம்'将不正确? 'ஓராயிரம்'? – thefourtheye

+0

@thefourtheye:我想要替换一些如何,至少意义将保持不变。你能帮忙吗? – charvi

回答

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告诉它“把匹配第一组(位)早在这里” (\ 1是为什么它需要是一个原始字符串 - 你想要通过re.sub解析,而不是Python的字符串文字规则)。

作为写入,上述代码假定每行字由恰好一个空间,这是从原始的代码,允许他们由空格的任何量来分离不同的分离,但将输出它们通过分离单一空间。为了配合这种行为,你可以修改正则表达式上面,像这样:

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

的\ S匹配任何空白字符,而+指在一排“的那场比赛的倍数,只要有至少一个”。

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

+0

只有上面的线足够了?或者我应该把更多的东西?因为我试过了,我没有工作。 – charvi

+0

@charvi你需要用你的实际单词1(即'ஒன்று')替换'word1',并且与所有单词2相似 - 它不会做任何类型的变量替换。我已经更新了我的答案,以使其更清楚。除此之外,它应该工作。你会得到什么输出? – lvc

+0

我曾试过,它并没有取代。我再次尝试,它不会取代它。 – charvi

相关问题