2017-02-07 12 views
2

におけるフィルタで正規表現を使用することがジュリア内の文字列にマッチするシンプルな条件合うアイテムフィルタリングすることが可能である:ジュリア

y = ["1 123","2512","31 12","1225"] 
filter(x-> ' ' in x, y) 

[出]:

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-> match(r"[\s]", x), y) 
TypeError: non-boolean (RegexMatch) used in boolean context 
in filter(::##95#96, ::Array{String,1}) at ./array.jl:1408 

> y = ["1 123","2512","31 12","1225"] 
> filter(x-> ' ' not in x, y) 
syntax: missing comma or) in argument list 

さらに、私はまた、正規表現を使用することを試みました

空白が文字列内にあるかどうかを確認する以外に、match()正規表現を使用して文字列のリストから項目を除外しますか?ために

+0

予想される出力は '[ "2512"、 "1225"]'、右? – RomanPerekhrest

+0

それは '[" 2512 "、" 1225 "]'ですが、 'match()'条件で 'filter()'を使う方法についてもっと一般的な質問があります。 – alvas

答えて

5

  1. filter(x-> !' ' in x, y)。ここでの優先順位は間違っています。エラーメッセージは、!関数を単一のChar引数に適用しようとしていることを伝えています:(!' ') in x

    julia> filter(x-> !(' ' in x), y) 
    2-element Array{String,1}: 
    "2512" 
    "1225" 
    
  2. filter(x-> ' ' not in x, y):あなたは、明示的な括弧を必要としています。 notはJuliaのキーワードではありません。

  3. filter(x-> match(r"[\s]", x), y)。このエラーは、ブーリアン値を期待しているが、それを取得していないことを伝えています。 Pythonとは異なり、Juliaには「真実」の値はありません。したがってmatchの代わりにismatchを使用してください。

    julia> filter(x->!ismatch(r"[\s]", x), y) 
    2-element Array{String,1}: 
    "2512" 
    "1225" 
    
+0

もう一度@MattB !!! – alvas

+0

クール、BTW、JuliaはNoney値を持っていますか? – alvas

+1

いいえ、ちょうど '真'と '偽'です。 –