首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用使用Python的字典缩略语替换

用使用Python的字典缩略语替换
EN

Stack Overflow用户
提问于 2014-11-11 01:26:49
回答 2查看 3K关注 0票数 1

我试图用缩写词典中的“核糖核酸”代替“rna”这样的词。我试着写了下面的文章,但是它并没有取代缩写。

代码语言:javascript
复制
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文件将是

代码语言:javascript
复制
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:

代码语言:javascript
复制
rna,ribonucleic acid
rnd,radical neck dissection
rni,recommended nutrient intake
rnp,ribonucleoprotein

我的输出文件应该用‘核糖核酸’代替'RNA‘

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-11 01:42:07

我认为这行s = str(ss)引起了问题-创建的列表刚刚变成了一个字符串!

试一试:

代码语言:javascript
复制
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)
票数 0
EN

Stack Overflow用户

发布于 2014-11-11 01:41:09

我想把'rna‘替换一下,但我的字典里有'RNA’。有没有办法让我无视这个案子。

好的。在创建字典时,只需在每个键上调用casefold,并在查找值时再次调用:

代码语言:javascript
复制
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/这样的二进制数据块可能会匹配。)

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

代码语言:javascript
复制
ss = open ("trial.csv", "r").readlines()
s = str(ss)

调用readlines意味着ss将是一个行列表。在列表中调用str意味着s将是一个包含[的大字符串,然后是每一行的回复(其中包含引号,反斜杠在其中转义,等等)。用逗号分隔,然后是]。你几乎肯定不想那样。如果您想按原样将整个文件读入字符串中,只需使用read()

你的数据似乎也有问题:

代码语言:javascript
复制
rna,ibonucleic acid

如果将rna替换为ibonucleic acid,等等,就会有一些难以读懂的输出。如果这真的是你的字典格式,而字典的用户应该推断出一些逻辑,例如,第一个字母是从缩写中复制出来的,那么你必须写出这个逻辑。例如:

代码语言:javascript
复制
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+)'

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26856001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档