2017-02-07 6 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-> ' ' 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

ожидаемый выход '[ "2512", "1225"]', верно? – RomanPerekhrest

+0

yep. это '[" 2512 "," 1225 "]', но вопрос более общий, спрашивая о том, как использовать 'filter()' с условиями 'match()'. – 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 - это не ключевое слово в Джулии.

  3. filter(x-> match(r"[\s]", x), y). Ошибка говорит вам, что он ожидал логическое значение, но не получил его. В отличие от Python, у Джулии нет «правдивых» значений. Поэтому вместо match используйте ismatch.

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

Еще раз спасибо @MattB !!! – alvas

+0

Прохладный, кстати, у Джулии есть значения Noney? – alvas

+1

Нет, просто 'true' и' false'. –

Смежные вопросы