在学习了 python 后试图进入 Julia,我在一些看似简单的事情上绊倒了。我想要一个将字符串作为参数的函数,但使用这些参数之一作为正则表达式来搜索某些内容。所以:
function patterncount(string::ASCIIString, kmer::ASCIIString)
numpatterns = eachmatch(kmer, string, true)
count(numpatterns)
end
Run Code Online (Sandbox Code Playgroud)
这有几个问题。首先,eachmatch期望一个Regex对象作为第一个参数,我似乎无法弄清楚如何转换字符串。在python中我会做r"{0}".format(kmer)- 有没有类似的东西?
其次,我显然不明白该count函数是如何工作的(来自文档):
计数(p,itr)?整数
计算 itr 中谓词 p 返回 true 的元素数。
但是我似乎无法弄清楚仅计算迭代器中有多少事物的谓词是什么。我可以制作一个简单的计数器循环,但我认为它必须是内置的。我就是找不到它(尝试过文档,尝试过搜索......没有运气)。
编辑:我也试过numpatterns = eachmatch(r"$kmer", string, true)- 不行。
要将字符串转换为正则表达式,请Regex在字符串上调用函数。
通常,要获得迭代器的长度,您可以使用该length函数。但是,在这种情况下,这不会真正起作用。该eachmatch 函数返回一个类型为 的对象Base.RegexMatchIterator,该对象没有length方法。所以,你可以count像你想的那样使用。第一个参数(谓词)应该是一个单参数函数,它返回true或false取决于您是否想对迭代器中的特定项目进行计数。在这种情况下该函数可以简单的匿名函数x->true,因为所有x的RegexMatchIterator,我们要指望它。
因此,鉴于这些信息,我会像这样编写您的函数:
patterncount(s::ASCIIString, kmer::ASCIIString) =
count(x->true, eachmatch(Regex(kmer), s, true))
Run Code Online (Sandbox Code Playgroud)
编辑:我还将第一个参数的名称s改为string,因为它string是一个 Julia 函数。如果我们在这个例子中让参数名保持不变,就不会发生什么可怕的事情,但通常好的做法是不要给变量名与内置函数名相同。