在Julia中的过滤器中使用正则表达式

alv*_*vas 3 regex lambda filter match julia

可以过滤符合简单条件的项目以匹配Julia中的字符串:

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

[出]:

2-element Array{String,1}:
 "1 123"
 "31 12"
Run Code Online (Sandbox Code Playgroud)

但是,如果要在过滤器中保留与条件不匹配的项目,如何才能做到相反呢?

此语法不正确:

> 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
Run Code Online (Sandbox Code Playgroud)

这样的Python都不是:

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

另外,我还尝试过使用正则表达式:

> 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
Run Code Online (Sandbox Code Playgroud)

除了检查字符串中是否包含空格外,如何match()将regex与一起使用以从字符串列表中过滤掉项目?

Mat*_* B. 5

为了:

  1. filter(x-> !' ' in x, y)。这里的优先顺序是错误的。错误消息告诉您它正在尝试将!函数应用于单个Char参数:(!' ') in x。您需要明确的括号:

    julia> filter(x-> !(' ' in x), y)
    2-element Array{String,1}:
     "2512"
     "1225"
    
    Run Code Online (Sandbox Code Playgroud)
  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"
    
    Run Code Online (Sandbox Code Playgroud)