计算字符串中X的出现次数

时间:2014-06-03 11:49:03

标签: julia

我正在寻找像Pythons这样的函数

"foobar, bar, foo".count("foo")

无法以明显的方式找到任何似乎能够做到这一点的功能。寻找一个不完全矫枉过正的单一功能。

7 个答案:

答案 0 :(得分:9)

regexp怎么样?

julia> length(matchall(r"ba", "foobar, bar, foo"))
2

答案 1 :(得分:7)

我认为现在最接近你所追求的内置事物是split(减去1)的长度。但要专门创造你所追求的东西并不困难。

我可以看到searchall在Julia的Base中通常很有用,类似于matchall。如果您不关心实际索引,可以使用计数器而不是增长idxs数组。

function searchall(s, t, overlap::Bool=false)
    idxfcn = overlap ? first : last
    r = search(s, t)
    idxs = Array(typeof(r), 0) # Or to only count: n = 0
    while last(r) > 0
        push!(idxs, r) # n += 1
        r = search(s, t, idxfcn(r) + 1)
    end
    idxs # return n
end

答案 2 :(得分:1)

很抱歉发布另一个答案,而不是评论上一个,但我没有管理如何在评论中处理代码块:)

如果你不喜欢正则表达式,可能是像这样的尾递归函数(使用matt建议的search()基函数):

function mycount(what::String, where::String)
  function mycountacc(what::String, where::String, acc::Int)
    res = search(where, what)
    res == 0:-1 ? acc : mycountacc(what, where[last(res) + 1:end], acc + 1)
  end
  what == "" ? 0 : mycountacc(what, where, 0)
end

答案 3 :(得分:1)

这很简单快速(并且不会溢出堆栈):

function mycount2(where::String, what::String)
    numfinds = 0
    starting = 1
    while true
        location = search(where, what, starting)
        isempty(location) && return numfinds
        numfinds += 1
        starting = location.stop + 1
    end
end

答案 4 :(得分:0)

Julia-1.0更新:

对于字符串中的单字符计数(通常,可迭代对象中的任何单项计数),可以使用Julia的count函数:

julia> count(i->(i=='f'), "foobar, bar, foo")
2

(第一个参数是返回:: Bool的谓词)。

对于给定的示例,应采用以下一种方法:

julia> length(collect(eachmatch(r"foo", "bar foo baz foo")))
2

答案 5 :(得分:0)

为此添加答案,以便进行插值:

julia> a = ", , ,";
julia> b = ",";
julia> length(collect(eachmatch(Regex(b), a)))
3

实际上,由于使用Regex,此解决方案在某些简单情况下无法使用。相反,可能会发现这很有用:

"""
count_flags(s::String, flag::String)

counts the number of flags `flag` in string `s`.
"""
function count_flags(s::String, flag::String)
counter = 0
for i in 1:length(s)
  if occursin(flag, s)
    s = replace(s, flag=> "", count=1)
    counter+=1
  else
    break
  end
end
return counter
end

答案 6 :(得分:0)

一个班轮:(朱莉娅1.3.1):

julia> sum([1 for i = eachmatch(r"foo", "foobar, bar, foo")])
2