Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Julia 将字符串参数转换为正则表达式_Julia - Fatal编程技术网

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

Julia 将字符串参数转换为正则表达式,julia,Julia,在学习python之后,我试图进入Julia,但我遇到了一些看似简单的事情。我想要一个函数,它将字符串作为参数,但使用其中一个参数作为正则表达式来搜索某些内容。因此: function patterncount(string::ASCIIString, kmer::ASCIIString) numpatterns = eachmatch(kmer, string, true) count(numpatterns) end 这有几个问题。首先,eachmatch需要一个Regex

在学习python之后,我试图进入Julia,但我遇到了一些看似简单的事情。我想要一个函数,它将字符串作为参数,但使用其中一个参数作为正则表达式来搜索某些内容。因此:

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
函数那样)。不过,我可能会做一些基准测试来验证这一点。