Julia 将字符串参数转换为正则表达式
在学习python之后,我试图进入Julia,但我遇到了一些看似简单的事情。我想要一个函数,它将字符串作为参数,但使用其中一个参数作为正则表达式来搜索某些内容。因此:Julia 将字符串参数转换为正则表达式,julia,Julia,在学习python之后,我试图进入Julia,但我遇到了一些看似简单的事情。我想要一个函数,它将字符串作为参数,但使用其中一个参数作为正则表达式来搜索某些内容。因此: function patterncount(string::ASCIIString, kmer::ASCIIString) numpatterns = eachmatch(kmer, string, true) count(numpatterns) end 这有几个问题。首先,eachmatch需要一个Regex
function patterncount(string::ASCIIString, kmer::ASCIIString)
numpatterns = eachmatch(kmer, string, true)
count(numpatterns)
end
这有几个问题。首先,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
,因为对于RegexMatchIterator
中的所有x
,我们要计算它
因此,考虑到这些信息,我会这样编写您的函数:
patterncount(s::ASCIIString, kmer::ASCIIString) =
count(x->true, eachmatch(Regex(kmer), s, true))
编辑:我还将第一个参数的名称更改为
s
,而不是string
,因为string
是一个Julia函数。如果我们在本例中让参数名保持不变,就不会发生什么可怕的事情,但通常最好的做法是不要给变量名与内置函数名相同。meta问题:这应该分为两个单独的问题吗?Derp-length
与python相同,不知道为什么我没想到。这两种解决方案都非常有效。我自己的教育有一个问题。如果s
确实很长,那么迭代器和将所有匹配项加载到数组之间是否存在性能差异?编辑:您已经回答了我的第二个问题-阅读理解失败如果有许多匹配项,那么使用count(x->true,eachmatch(…)
解决方案(迭代器版本)应该更节省内存,而不是将所有匹配项加载到数组中(就像matchall
函数那样)。不过,我可能会做一些基准测试来验证这一点。