使用Python替换字典中的缩写

时间:2014-11-11 01:26:50

标签: python csv dictionary replace abbreviation

我正试图用缩写词典中的'ribonucleic acid'替换像'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

Sample.csv示例:

rna,ribonucleic acid
rnd,radical neck dissection
rni,recommended nutrient intake
rnp,ribonucleoprotein

我的输出文件应该用'核糖核酸'取代'RNA'

2 个答案:

答案 0 :(得分:1)

  

我正在尝试替换'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中添加,但它可能晚于......),请使用{{1}而是。对于非英语字符,它并不总是做正确的事情(例如,lower'ß'.casefold(),而'ss''ß'.lower()),但似乎可以你的申请。 (如果不是,则必须使用'ß'编写更复杂的内容,或者找到第三方库。)


  

此外,我不希望它用'coribonucleic acid'取代'corna'(我知道这个词不存在,但我想确保它不会发生)。

嗯,你已经用你的unicodedata做了这个,它分裂了任何“非单词”字符;然后,您可以选择查找每个结果。由于re.split不在dict中,因此不会被替换。 (虽然注意corna的“单词”字符的概念可能实际上并不是你想要的 - 它包含下划线和数字作为单词的一部分,所以re将不匹配,而一块像rna2dna这样的二进制数据可能会。)


您的代码中还有另一个严重问题:

s1$_2(rNa/

调用ss = open ("trial.csv", "r").readlines() s = str(ss) 表示readlines将成为行列表。在该列表上调用ss意味着str将是一个包含s的大字符串,然后是每行的repr(带有引号,反斜杠在其中转义等)用逗号分隔,然后[。你几乎肯定不希望这样。如果你想按原样将整个文件读成字符串,只需使用]


您的数据似乎也有问题:

read()

如果您将rna,ibonucleic acid 替换为rna,依此类推,那么您将会有一些难以阅读的输出。如果这实际上是你的字典格式,并且字典的用户应该推断某些逻辑,例如,第一个字母从缩写中复制,则必须编写该逻辑。例如:

ibonucleic acid

最后,在字符串文字中使用未转义的反斜杠是个坏主意。在这种情况下,你可以逃脱它,因为Python恰好没有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)) 的含义,但这并不总是如此。解决此问题的最佳方法是使用原始字符串文字,例如\W

答案 1 :(得分:0)

我认为此行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)