我正试图用缩写词典中的'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'
答案 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)