在学习python之后尝试进入Julia,我绊倒了一些看似简单的事情。我想有一个函数,它将字符串作为参数,但使用其中一个参数作为正则表达式来搜索某些东西。所以:
function patterncount(string::ASCIIString, kmer::ASCIIString)
numpatterns = eachmatch(kmer, string, true)
count(numpatterns)
end
这有几个问题。首先,eachmatch
期望Regex
对象作为第一个参数,我似乎无法弄清楚如何转换字符串。在python我会做r"{0}".format(kmer)
- 有类似的东西吗?
其次,我显然不明白count
函数的工作原理(from the docs):
count(p,itr)→整数
计算itr中谓词p返回true的元素数。
但我似乎无法弄清楚谓词是什么只是计算迭代器中有多少东西。我可以做一个简单的计数器循环,但我认为必须内置。我只是找不到它(试过文档,尝试搜索SO ...没有运气)。
编辑:我也试过了numpatterns = eachmatch(r"$kmer", string, true)
- 没有去。
答案 0 :(得分:4)
要将字符串转换为正则表达式,请在字符串上调用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))
编辑:我还将第一个参数的名称更改为s
而不是string
,因为string
是Julia函数。如果我们在这个例子中将参数名称保持相同,那么就不会发生任何可怕的事情,但通常不要将变量名称与内置函数名称相同。