julia到正则表达式匹配像grep这样的文件中的行

时间:2017-11-10 00:32:35

标签: julia

我想看一个julia的代码片段,它将读取一个文件并返回与正则表达式匹配的行(字符串类型)。

我欢迎多种技术,但输出应该等同于以下内容:

$> grep -E ^AB[AJ].*TO' 'webster-unabridged-dictionary-1913.txt'

ABACTOR
ABATOR
ABATTOIR
ABJURATORY

我在这里使用GNU grep 3.1,文件中每个条目的第一行都是全部大写单词。

3 个答案:

答案 0 :(得分:3)

我最喜欢的解决方案使用简单的循环,非常容易理解。

julia> open("webster-unabridged-dictionary-1913.txt") do f
           for i in eachline(f)
               if ismatch(r"^AB[AJ].*TO", i) println(i) end
           end
       end

ABACTOR
ABATOR
ABATTOIR
ABJURATORY

注释

  • 带有制表符分隔的行保留了制表符(没有'\ t'的文字输出)
  • 此示例中的源文件在定义上方的一行中仅包含所有大写字典中的字典单词;返回完整的一行。
  • 文件I / O操作包含在do block syntax structure中,对于多行函数,它比lamba x -> f(x)语法更方便地表示匿名函数。这对于文件open()命令尤其具有表现力,该命令在使用函数作为参数调用时使用try-finally-close操作定义。
  • Julia docs: Strings/Regular Expressions
    • 正则表达式对象采用r"<regex_literal_here>"
    • 形式
    • 正则表达式本身就是一个字符串
    • 基于perl PCRE library
    • 匹配成为正则表达式匹配对象

例如

julia> reg = r"^AB[AJ].*TO";
julia> typeof(reg)
Regex

julia> test = match(reg, "ABJURATORY")
RegexMatch("ABJURATO")

julia> typeof(test)
RegexMatch

答案 1 :(得分:2)

您也可以使用filter功能在一行中执行此操作。

filter(line -> ismatch(r"^AB[AJ].*TO",line),readlines(open("webster-unabridged-dictionary-1913.txt")))

filter应用一个函数,将布尔值返回给数组,并仅返回数组中true的元素。在这种情况下,函数是一个匿名函数line -> ismatch(r"^AB[AJ].*TO",line)",它基本上表示调用被过滤的数组的每个元素(在这种情况下,每一行)line

我认为这可能不是非常大的文件的最佳解决方案,因为整个文件需要在过滤之前加载到内存中,但是对于这个示例,它似乎与使用eachline的for循环一样快。另一个不同之处在于,此解决方案将结果作为数组返回而不是打印每个结果,这取决于您要对匹配执行的操作可能是好事还是坏事。

答案 2 :(得分:1)

;放在前面是Julia使用命令行命令的方法,因此这适用于Julia的REPL

;grep -E ^AB[AJ].*TO' 'webster-unabridged-dictionary-1913.txt'