【问题标题】:Using regex in filter in Julia在 Julia 的过滤器中使用正则表达式
【发布时间】:2017-02-07 06:54:09
【问题描述】:

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

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() 和正则表达式从字符串列表中过滤掉项目?

【问题讨论】:

  • 预期的输出是 ["2512", "1225"] ,对吧?
  • 是的。它是["2512", "1225"],但问题更笼统,询问如何在match() 条件下使用filter()

标签: regex lambda filter match julia


【解决方案1】:

按顺序:

  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,而是使用contains

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

【讨论】:

  • 酷,顺便说一句,朱莉娅有诺尼值吗?
  • 不,只是truefalse
  • 在 Julia 1.0 中这将是 filter(x -> match(r"[\s]", x) === nothing, y)
  • 稍微简单一点的是filter(!contains(r"[\s]"), y)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多