将字符串参数转换为正则表达式

时间:2015-06-23 10:44:07

标签: julia

在学习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) - 没有去。

1 个答案:

答案 0 :(得分:4)

要将字符串转换为正则表达式,请在字符串上调用Regex函数。

通常,要获取迭代器的长度,请使用length函数。但是,在这种情况下,这将无法真正起作用。 eachmatch函数返回Base.RegexMatchIterator类型的对象,该对象没有length方法。因此,您可以按照您的想法使用count。第一个参数(谓词)应该是一个返回truefalse的参数函数,具体取决于您是否要计算迭代器中的特定项。在这种情况下,该函数可以只是匿名函数x->true,因为对于x中的所有RegexMatchIterator,我们都要计算它。

所以,鉴于这些信息,我会写这样的函数:

patterncount(s::ASCIIString, kmer::ASCIIString) = 
    count(x->true, eachmatch(Regex(kmer), s, true))

编辑:我还将第一个参数的名称更改为s而不是string,因为string是Julia函数。如果我们在这个例子中将参数名称保持相同,那么就不会发生任何可怕的事情,但通常不要将变量名称与内置函数名称相同。