罗西模式语言,一种更好的挖掘数据的方法

你好RPL,再见regex!罗西让在数据堆中找到数据针变得容易多了。

我们都有过这样的经历:你有大量的非结构化或半结构化数据要筛选,就像任何精明的书呆子一样,你知道手动地做这些事是违背一切美好和神圣的[播放《碟中谍》音乐].您必须接受的问题是,如何高效、高效地自动化提取过程。作为一名数字领域的老手,你可能会转向你非常熟悉的工具,比如Grep.它是实现正则表达式的老工具。假设您想在一个文本文件中找到所有的IPv4地址。你可以使用:

grep oe " \ b ([0 - 9] {1,3} \) {3} [0 - 9] {1,3} \ b”datafile.txt

这一regex不太难以理解,但它并不完美,因为它将打印有效和无效的IPv4地址,因为它相当简单地识别0.0.0.0至999.999.999.999.999的字符串。因此,让我们收紧此正则表单,以便仅打印有效的IPv4地址:

Grep -e -o“(25 [0-5] | 2 [0-4] [0-9] | [0-9] [0-9]?)\。(25 [0-5] | 2 [0-4] | [0-9] | [0-9] [0-9]?)\。(25 [0-5] | 2 [0-4] [0-9[01] [0-9] [0-9]?)\。(25 [0-5] | 2 [0-4] [0-9] | [0-9] [0-9]?)“datafile.txt

瞧!任务完成了,但这是一个丑陋的正则表达式,更可怕的是IPv6地址的正则表达式(props to在RegExLib.com上mij):

grep -oeoe“(:: |(([a-fa-f0-9] {1,4}):) {7}(([a-fa-f0-9] {1,4})|(:(:([a-fa-f0-9] {1,4})){1,6})|(((([a-fa-f0-9] {1,4}):) {1,6} :) |((((((([A-FA-F0-9] {1,4}):)(:([A-FA-F0-9] {1,4})){1,6})|(((([a-fa-f0-9] {1,4}):) {2}(:( [a-fa-f0-9] {1,4})){1,5})|((([a-fa-f0-9] {1,4}):) {3}(:( [a-fa-f0-9] {1,4})){1,4})|((([a-fa-f0-9] {1,4}):) {4}(:([a-fa-f0-9] {1,4})){1,3})|((([A-FA-F0-9] {1,4}):) {5}(:( [a-fa-f0-9] {1,4})){1,2}))“datafile.txt.

与所有有用的regex,进行修改时一个复杂的正则表达式输入格式发生变化是忧郁的秘诀,厄运,不眠之夜,因为重建正则表达式的逻辑导致的问题通常是重要的(我是指它是一个工作没有一个头脑清醒的人会想解决)。

可是等等!这不是所有问题!正则表达式可以很容易地变得可怕,因为它很容易创建一个争吵的正则表达式,它肆意消耗处理器周期(参见优秀的文章失控正则表达式:灾难性的回溯).换句话说,预测和优化正则表达式是困难的、不可预测的,而且非常非常恼人。

那么,书呆子该怎么办呢?忍受不可容忍的正则表达式的攻击或使用其他工具来对付不可容忍的模式,并通过编码结束它们:编码,不再测试!是的!不过我跑题了……

有一个更好的办法,我的朋友们罗西模式语言它优雅、强大,可能只允许我们永远丢弃正则表达式。

罗西1 Jamie Jennings / IBM

罗西是由杰米A.詹宁斯开发的,他将自己描述为“前学术在行业工作(他们有饼干)”。Jennings女士担任IBM的高级技术人员,是IBM云部门先进技术团队的一部分。她的生物增加了“在她的业余时间,她扮演了冰球并写作编译器。”

尽管如此,Rosie Pattern Language和Rosie Pattern Engine是在2016年初发布的git repo.,因此系统解释:

Rosie是正则表达式(regex)的强大替代方案,它将模式与任何输入文本进行匹配。Rosie提供了数百个时间戳、网络地址、电子邮件地址、CSV文件等示例模式。

与大多数正则表达式工具不同,Rosie可以生成结构化(JSON)输出。而且,Rosie有一个交互式模式开发模式来帮助编写和调试模式。

罗西模式引擎小于400kb(是,千字节)的磁盘空间,以及大约20MB的内存。典型的日志文件在我的4岁MacBook Pro上约为40,000行/秒,其中其他(流行的)解决方案没有实现10,000行/秒。

Rosie模式语言是大数据分析的理想选择,因为Rosie快速,具有可预测的性能(与大多数正则表达式引擎不同),并为下游分析生成JSON输出。

更有深入了解Rosie的“为什么”,退房詹宁斯女士的文章为什么要用罗茜式语言

安装罗西相当容易(在Macos通过家酿对安装RHEL 7、Ubuntu 16、Windows 10周年纪念版和Docker也有提示。一旦安装好,你可以像这样检查罗西的配置:

RedQueen:rosie mgibbs$ rosie -info本地安装信息:ROSIE_HOME = /usr/local/Cellar/rosie/current/share/rosie ROSIE_VERSION = 0.99i HOSTNAME = RedQueen。local HOSTTYPE = x86_64 OSTYPE = darwin16当前调用:当前工作目录= /Users/mgibbs调用命令= bash /usr/local/bin/ Rosie -info脚本值Rosie home = /usr/local/ cellar / Rosie / Current /share/ Rosie的环境变量$ROSIE_HOME is not set RedQueen: Rosie mgibbs$ . / ROSIE_HOME is not set

罗西有通常的帮助输出:

Redqueen:Rosie Mgibbs $ Rosie -Help这是Rosie V0.99i帮助:使用:Bash / USR / Local / Bin / Rosie -Help *有效:-Help -Patterns -verbose -all -Repl -Repl -Repl -Grep -Eval--info-manifest -f -e -encode -help打印此消息-patterns打印可用模式的打印列表 - 鼠标输出警告和其他信息消息 - 所有写入匹配与stdout和非匹配行到stderr -repl在交互式模式下启动rosie(read-eval-print循环)-grep模拟grep(弱),但是通过rpl搜索输入-eval输出中的所有出现,详细的“迹线”评估模式如何处理输入;此功能会生成大量的输出,因此最好将其在一行输入上使用 - 将整个输入文件作为单个字符串作为单个字符串,而不是线路-info打印信息有关本地Rosie安装的信息 -  Manifest加载清单从$ sys(Rosie Install目录)中的文件而不是清单);使用单个短划线' - '无法加载清单文件-f加载rpl文件,在清单(如果有的话)之后,请加载-e编译rpl语句,在清单和rpl文件(如果有的话)是加载的-encode编码输出以格式:颜色(默认),nocolor,fulltext或json rpl表达式,它可以是定义模式的名称,每行将与其匹配+一个或多个文件名来处理,其中一个可能是一个dash "-" to read from standard input Notes: (1) lines from the input file for which the pattern does NOT match are written to stderr so they can be redirected, e.g. to /dev/null (2) the -eval option currently does not work with the -grep option RedQueen:rosie mgibbs$

要展示罗西如何工作,请考虑输出ifconfig命令(来自macOS Sierra):

Redqueen:rosie mgibbs $ ifconfig lo0:标志= 8049  MTU 16384选项= 1203  INET 127.0.0.1 NetMask 0xFF000000 INET6 :: 1 Prefixlen 128 INET6 FE80 ::1%lo0 prefixlen 64 scopeid 0x1 nd6选项= 201  gif0:标志= 8010  mtu 1280 stf0:标志= 0 <> MTU 1280 EN0:标志= 8963  MTU 1500选项= 10B 乙醚AC:87:850:87:8B INET6 FE80 :: 425:850:43A6:5863%EN0前缀64安全SCOPEID0x4 INET6 2605:E000:6A0B:2500:86D:8286:CA88:9F8前缀64 AutoConf安全INET 192.168.0.180 NetMask 0xFFFFFF00播放192.168.0.255 INET6 2605:E000:6A0B:2500:18F1:F5DF:7F9:2FA4前缀64已弃用AutoConf临时INET6 2605:E000:6A0B:2500:38B4:EA13:FFF3:FFF3:9698 Prefixlen 64已弃用AutoConf临时INET6 2605:E000:6A0B:2500:B49E:AB54:BC4:5717前缀64已弃用AutoConf临时INET6 2605:E000:6A0B:2500:9831:439F:F75:7A40前缀64已弃用AutoConf临时INET6 2605:E000:6A0B:2500:18A4:3D38:3D38:3D38:7395:5C5A Prefixlen 64已弃用AutoConf临时INET6 2605:E000:6A0B:2500:3188:37CE:A627:B276 Prefixlen 64已弃用AutoConf临时INET6 2605:E000:6A0B:2500:DD77:14E:2011:634前缀64 AutoConf临时ND6选项= 201 介质:AutoSelect(1000Baset <全双工,流量控制,节能 - 以太网>)状态:Active EN1:标志= 8823  MTU 1500乙醚B8:09:8A:CF:83:8F ND6选项= 201  Media:AutoSelect()状态:非活动状态EN2:标志= 963  MTU 1500选项= 60  Ether 0A:00:00:78:3D:10媒体:自动选择状态:活动EN3:标志=963  MTU 1500选项= 60  EtO6> Ether 0A:00:00:78:3D:11媒体:自动选择状态:非活动网桥0:标志= 8863  MTU 1500选项= 63  E0A:00:00:78:3D:11 INET6 FE80 :::1493:92DE:58EE:96EB%Bridge0 Prefixlen 64安全ScopeID 0x8 INET 169.254.239.110 NetMask 0xFFFF0000播放169.254.255.255配置:ID 0:0:0:0:0:0优先级0 HellOtime 0 FWDDelay 0 MaxAGE 0 HOLDCNT 0 PROTO STP MAXADDR 100超时1200根ID 0:0:0:0:0:0优先级0 IFCOST 0端口0 IPFILTER禁用标志0x2成员:EN3标志= 3  ifmaxaddr 0 port 7 priority 0 path cost 0 member: en2 flags=3 ifmaxaddr 0 port 6 priority 0 path cost 0 nd6 options=201 media: autoselect status: active p2p0: flags=8802 mtu 2304 ether 0a:09:8a:cf:83:8f media: autoselect status: inactive awdl0: flags=8902 mtu 1484 ether 1e:bb:87:15:37:c8 nd6 options=201 media: autoselect status: inactive utun0: flags=8051 mtu 2000 inet6 fe80::42fb:52c5:cff7:807e%utun0 prefixlen 64 scopeid 0xb nd6 options=201 vboxnet0: flags=8842 mtu 1500 ether 0a:00:27:00:00:00 vboxnet1: flags=8842 mtu 1500 ether 0a:00:27:00:00:01 vboxnet2: flags=8842 mtu 1500 ether 0a:00:27:00:00:02 utun1: flags=8051 mtu 1380 inet6 fe80::37b0:cdae:5ad4:4f0e%utun1 prefixlen 64 scopeid 0xf nd6 options=201 utun2: flags=8051 mtu 1380 inet6 fe80::8e14:3930:f5f9:ae9c%utun2 prefixlen 64 scopeid 0x10 nd6 options=201 RedQueen:rosie mgibbs$

让我们将其保存到文件中:

RedQueen:rosie mgibbs$ ifconfig > ifconfig.txt

我们将使用预定义模式的默认集合来分析这些数据。这些模式是使用罗西模式语言您可以使用它交互方式探索交互式读取-eval-print循环(repl).现在,让罗西来分析我们的测试数据

罗西2 马克·吉布斯

命令行,罗西基本。matchall ifconfig.txt指示罗西使用模式基本.Matchall.其中在RPL文件中指定,basic.rpl像这样:

Basic.Matchall =(Basic.DateTime_Patterns / Basic.Network_Patterns / Basic.Element / Basic.Element_Quoted / Basic.Element_Brocketed / [:Space:] + / Basic.Punctumy / Basic.Unmatched)+

正如你所看到的那样,基本.Matchall.模式是由许多其他模式构建而成的,而这些模式又是由其他模式构建而成的……它自始至终都是模式,这使得从现有模式构建自己的模式变得很容易添加新模式以执行所需的任何专门的数据提取任务。

有关的:
12 4.
第1页共2页
工资调查:结果是