我试图用缩写词典中的“核糖核酸”代替“rna”这样的词。我试着写了下面的文章,但是它并没有取代缩写。
import csv,re
outfile = open ("Dict.txt", "w")
with open('Dictionary.csv', mode='r') as infile:
reader = csv.reader(infile)
mydict = {rows[0]:rows[1] for rows in reader}
print >> outfile, mydict
out = open ("out.txt", "w")
ss = open ("trial.csv", "r").readlines()
s = str(ss)
def process(s):
da = ''.join( mydict.get( word, word ) for word in re.split( '(\W+)', s ) )
print >> out, da
process(s)一个示例trial.csv文件将是
A,B,C,D
RNA,lung cancer,15,biotin
RNA,lung cancer,15,biotin
RNA,breast cancer,15,biotin
RNA,breast cancer,15,biotin
RNA,lung cancer,15,biotin样本Dictionary.csv:
rna,ribonucleic acid
rnd,radical neck dissection
rni,recommended nutrient intake
rnp,ribonucleoprotein我的输出文件应该用‘核糖核酸’代替'RNA‘
发布于 2014-11-11 01:42:07
我认为这行s = str(ss)引起了问题-创建的列表刚刚变成了一个字符串!
试一试:
def process(ss):
for line in ss:
da = ''.join( mydict.get( word, word ) for word in re.split( '(\W+)', line ) )
print >> out, da
process(ss)发布于 2014-11-11 01:41:09
我想把'rna‘替换一下,但我的字典里有'RNA’。有没有办法让我无视这个案子。
好的。在创建字典时,只需在每个键上调用casefold,并在查找值时再次调用:
mydict = {rows[0].casefold(): rows[1] for rows in reader}
# ...
da = ''.join( mydict.get(word.casefold(), word) for word in re.split( '(\W+)', s ) )如果您使用的是一个没有casefold的较旧版本的Python (IIRC ),那么它是在2.7和3.2中添加的,但它可能比那个…晚),改为使用lower。它并不总是对非英语字符做正确的事情(例如,'ß'.casefold()是'ss','ß'.lower()是'ß'),但是对于您的应用程序来说,这似乎是可以的。(如果不是,你要么用unicodedata写一些更复杂的东西,要么找一个第三方库。)
另外,我不想用“corna”代替“corna”(我知道这个词不存在,但我想确保它不会发生)。
好吧,您已经在使用您的re.split了,它在任何“非单词”字符上拆分,然后分别查找每个生成的单词。由于corna不会出现在dict中,所以它不会被替换。(尽管请注意,re的" word“字符的概念可能实际上并不是您想要的--它将下划线和数字作为单词的一部分,这样rna2dna就不会匹配,而像s1$_2(rNa/这样的二进制数据块可能会匹配。)
您的代码中还存在另一个严重问题:
ss = open ("trial.csv", "r").readlines()
s = str(ss)调用readlines意味着ss将是一个行列表。在列表中调用str意味着s将是一个包含[的大字符串,然后是每一行的回复(其中包含引号,反斜杠在其中转义,等等)。用逗号分隔,然后是]。你几乎肯定不想那样。如果您想按原样将整个文件读入字符串中,只需使用read()。
你的数据似乎也有问题:
rna,ibonucleic acid如果将rna替换为ibonucleic acid,等等,就会有一些难以读懂的输出。如果这真的是你的字典格式,而字典的用户应该推断出一些逻辑,例如,第一个字母是从缩写中复制出来的,那么你必须写出这个逻辑。例如:
def lookup(word):
try:
return word[0] + mydict[word.casefold()]
except KeyError:
return word
da = ''.join(lookup(word) for word in re.split('(\W+), s))最后,在字符串文本中使用未转义反斜杠是个坏主意。在本例中,您可以不使用它,因为Python碰巧对\W没有意义,但这并不总是正确的。解决这个问题的最好方法是使用原始字符串文本,比如r'(\W+)'。
https://stackoverflow.com/questions/26856001
复制相似问题