替换为使用Python的字典中的缩写

2024-04-20 04:14:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用缩略语词典中的“核糖核酸”代替“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)

样品试用版.csv文件应该是

^{pr2}$

样品字典.csv公司名称:

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

我的输出文件应该用“核糖核酸”替换“RNA”


Tags: csvinretxtforopenoutmydict
2条回答

I'm trying to replace 'RNA' but my dictionary has 'rna'. Is there a way I can ignore the case.

当然可以。只需在创建字典时对每个键调用^{},然后在查找值时再次调用:

mydict = {rows[0].casefold(): rows[1] for rows in reader}

# ...

da = ''.join( mydict.get(word.casefold(), word) for word in re.split( '(\W+)', s ) )

如果您使用的Python的旧版本没有casefold(IIRC,它是在2.7和3.2中添加的,但可能比这个版本晚…),请改用lower。对于非英语字符,它并不总是正确的(例如,'ß'.casefold()'ss',而{}是{}),但似乎这对您的应用程序来说是可以的。(如果不是这样,您必须用unicodedata编写更复杂的东西,或者找到第三方库。)


Also, I don't want it to replace 'corna' (I know such a word doesn't exist, but I want to make sure it doesn't happen) with 'coribonucleic acid'.

好吧,你已经在用你的re.split来做这件事了,它对任何“非单词”字符进行拆分;然后分别查找每个得到的单词。由于corna不在dict中,因此不会被替换。(请注意,re的“word”字符的概念实际上可能不是您想要的,它包含下划线和数字作为单词的一部分,因此rna2dna将不匹配,而像s1$_2(rNa/这样的二进制数据块可能会匹配。)


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

^{pr2}$

调用readlines意味着{}将是一个行列表。在该列表中调用str意味着s将是一个带有[的大字符串,然后用逗号分隔每行的repr(其周围有引号、反斜杠转义符等),然后是]。你肯定不想那样。如果您想按原样将整个文件读入字符串,只需使用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+)'。在

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

相关问题 更多 >