该程序用于检查两个特定单词(例如:'ஒன்று'和'கோடி')是否连续出现,如果是,则用特定单词替换第一个单词(例如:'ஒரு')。我必须从文件中读取内容并将其写入另一个文件。我使用了一个标志变量,从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 :(得分: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
阻止时自动发生。