可以过滤符合简单条件的项目以匹配Julia中的字符串:
y = ["1 123","2512","31 12","1225"]
filter(x-> ' ' in x, y)
[OUT]:
2-element Array{String,1}:
"1 123"
"31 12"
但是,如果我想保留与过滤条件不匹配的项目,我该怎么做?
这种语法不正确:
> y = ["1 123","2512","31 12","1225"]
> filter(x-> !' ' in x, y)
MethodError: no method matching !(::Char)
Closest candidates are:
!(::Bool) at bool.jl:16
!(::BitArray{N}) at bitarray.jl:1036
!(::AbstractArray{Bool,N}) at arraymath.jl:30
...
in filter(::##93#94, ::Array{String,1}) at ./array.jl:1408
也不像Python那样:
> y = ["1 123","2512","31 12","1225"]
> filter(x-> ' ' not in x, y)
syntax: missing comma or ) in argument list
此外,我还尝试使用正则表达式:
> y = ["1 123","2512","31 12","1225"]
> filter(x-> match(r"[\s]", x), y)
TypeError: non-boolean (RegexMatch) used in boolean context
in filter(::##95#96, ::Array{String,1}) at ./array.jl:1408
除了检查空格是否在字符串中之外,如何使用带有正则表达式的match()
来过滤掉字符串列表中的项目?
答案 0 :(得分:5)
按顺序:
filter(x-> !' ' in x, y)
。优先权在这里是错误的。该错误消息告诉您它正在尝试将!
函数应用于单个Char
参数:(!' ') in x
。您需要明确的括号:
julia> filter(x-> !(' ' in x), y)
2-element Array{String,1}:
"2512"
"1225"
filter(x-> ' ' not in x, y)
。 not
在Julia中不是关键字。
filter(x-> match(r"[\s]", x), y)
。该错误告诉您它期望一个布尔值,但没有得到一个。与Python不同,Julia没有" truthy"值。因此,请使用ismatch
。而不是match
。
julia> filter(x->!ismatch(r"[\s]", x), y)
2-element Array{String,1}:
"2512"
"1225"