如何使用Julia替换字符串中的多个字符

8
我正在试图解决这个问题:http://rosalind.info/problems/revc/ 我想用T、G、C、A替换所有出现的A、C、G、T,换句话说,所有的A将被替换成T,所有的C将被替换成G等等。
我以前使用过replace()函数将所有出现的'T'替换为'U',希望它能接受一个字符列表并替换为另一个字符列表,但我无法使它工作,所以它可能没有这个功能。
我知道我可以使用BioJulia软件包轻松解决这个问题,并已经这样做了,如下所示:
# creating complementary strand of DNA
# reverse the string
# find the complementary nucleotide
using Bio.Seq
s = dna"AAAACCCGGT"

t = reverse(complement(s))

println("$t")

但我希望不必依赖这个软件包。

以下是我目前的代码,如果有人能指导我方向就太好了。

# creating complementary strand of DNA
# reverse the string
# find the complementary nucleotide

s = open("nt.txt") # open file containing sequence

t = reverse(s) # reverse the sequence

final = replace(t, r'[ACGT]', '[TGCA]') # this is probably incorrect
# replace characters ACGT with TGCA

println("$final")
1个回答

8

看起来在it技术中,replace并不能像Bash中的tr那样进行翻译。因此,下面介绍两种使用字典映射的方法(BioJulia包似乎也类似使用字典):

compliments = Dict('A' => 'T', 'C' => 'G', 'G' => 'C', 'T' => 'A')

然后,如果str = "AAAACCCGGT",你可以像这样使用join
julia> join([compliments[c] for c in str])
"TTTTGGGCCA"

另一种方法是使用函数和 map

function translate(c)
    compliments[c]
end

然后:

julia> map(translate, str)
"TTTTGGGCCA"

字符串是Julia中的可迭代对象;每个方法都会逐个读取字符,并将其传递给字典以获取对应的字符。这些补充字符构建成一个新的字符串。

Julia的字符串也是不可变的:您无法在原地交换字符,而是需要构建一个新的字符串。


当我提供str =“AAACCCGGT”时,它可以完美运行,但是如果我尝试打开文件并以此获取字符串,则会出现“在字典的getindex中未找到”的错误。另外,您能详细说明一下底部的函数如何解决我的问题吗?索引字典如何改变我的字符串?我正在阅读《精通Julia》,但只看了几章,并且昨天才接触Julia,因此虽然我有些了解,但对于其中一些机制仍不太熟悉,这就是其中之一。 - System
1
关于错误,可能是您从文件中读取了换行符。这些字符没有被映射到字典中,因此会引发错误。您可以尝试 map(translate, readchomp(s)) - Alex Riley
1
map(translate, str)会根据str返回一个新的已翻译字符串,类似地,replace(str, match, replacement)也会返回一个新字符串,例如:x =“test”;y = replace(x,'e','E');x,y将返回(“test”,“tEst”)。它们不会直接更新您原来的字符串! - HarmonicaMuse
@IsmaelVenegasCastelló:我想知道是否正确,Julia的字符串由于是不可变的,所以没有(方便的)方法可以直接修改它们?我自己还在学习Julia,很好奇是否有什么我错过的东西。 - Alex Riley
2
@ajcr 我不这么认为,你可能想要查看 MutableStrings.jlStrings.jl 这两个库,它们提供了一种符合习惯的方法来完成这个任务!:D - HarmonicaMuse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接