我想取得字符串c=“9S8M13S”,S前的数字。返回9和13
julia> c="9S8M13S"
"9S8M13S"
julia> fs=findall(r"\d*S",c)
2-element Vector{UnitRange{Int64}}:
1:2
5:7
julia> first.(fs)
2-element Vector{Int64}:
1
5
julia> last.(fs).-1
2-element Vector{Int64}:
1
6
julia> z=zip(first.(fs),last.(fs).-1)
zip([1, 5], [1, 6])
a=Int[]
for (i,j) in z
push!(a,parse(Int,c[i:j]))
end
julia> a
2-element Vector{Int64}:
9
13
有没有更直接的方法呢,这样感觉有点麻烦呢
gxliu
2
我的建议是先提取字符串中的所有数字,然后再转换类型。
julia> a = "9S8M13S"
"9S8M13S"
julia> ii = findall(r"\d+\.?\d*(?=S)",a)
2-element Vector{UnitRange{Int64}}:
1:1
5:6
julia> parse(Int, a[ii[1]])
9
参考 @RexWzh 的回答,我也写了个一行版本。
julia> [parse(Int, a[i]) for i in findall(r"\d+\.?\d*(?=S)",a)]
2-element Vector{Int64}:
9
13
3 个赞
RexWzh
3
正则表达式
reg = r"(\d+)S"
[parse(Int, i.captures[1]) for i in eachmatch(reg, "9SM13S")]
# 2-element Vector{Int64}:
# 9
# 13
或者用命名分组,增加可读性
reg = r"(?<num>\d+)S"
[parse(Int, m[:num]) for m in eachmatch(reg, "9SM13S")]
参考楼上回答,也可以用断言而不借助分组
reg = r"\d+(?=S)"
[parse(Int, m.match) for m in eachmatch(reg, "9SM13S")]
相关用法可以看这个笔记
2 个赞