在Julia中使用正则表达式进行过滤

8

在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() 方法来从字符串列表中过滤出特定的项?


预期输出是 ["2512", "1225"],对吗? - RomanPerekhrest
是的,它是["2512", "1225"],但问题更通用,询问如何使用filter()match()条件。 - alvas
1个回答

12
  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-> ' '不在x中, y)。在Julia中,not不是关键字。

  3. filter(x-> contains(r"[\s]", x), y)。该错误告诉您它期望得到一个布尔值,但没有得到。与Python不同,Julia没有“真实”值。因此,不要使用match,而是使用contains

  4. julia> filter(!contains(r"[\s]"), y)
    2-element Vector{String}:
     "2512"
     "1225"
    

顺便问一下,Julia 有 Noney 值吗? - alvas
1
不,只有 truefalse - mbauman
在Julia 1.0中,这将是 filter(x -> match(r"[\s]", x) === nothing, y) - Diego Javier Zea
稍微简单一些的是 filter(!contains(r"[\s]"), y) - mbauman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接