技术编程|30 分钟轻松搞定正则表达式基础( 四 )


元字符名称说明
(?=exp)零宽度正预测先行断言匹配exp前面的位置(?上面的表格主要看第一列它是什么格式就好 , 反正后面的名称和说明也很难看懂 。接下来我来用自己的理解通俗的解释一下这些概念 。
首先字符串中可以有四种方式确认某个子字符串的位置 , 如字符串‘BACAB’中有两个A , A前面是B、A前面不是B、A后面是C、A后面不是C 。上述四种条件都能够匹配出唯一一个子字符串A 。这个例子大概理解的话就可以往后看了 。
(?=exp)中exp指代的是任意元字符的组合 , 结合具体的例子来理解该元字符的用法 , 一个正则表达式为A(?=C) , 它代表的情况就是A后面是C的情况 。所以匹配出了第一个A , 由于该元字符是零宽所以它只能匹配出A而不是AC 。
(?(?!exp)的例子为:A(?!C) , 它代表的情况为A后面不是C , 所以匹配出第二个A 。
(?
通过上面四个例子的介绍 , 应该对于这两个概念、四个元字符有了了解 。理解是重点 , 记下来也是重点 。本人是这样记下来的 , 四个元字符的基本格式都是(?) , 只不过问号后面的不一样 。分下面两种情况:
XXX前/后是XXX的话就写一个= , XXX前/后不是XXX的话就写一个! 。这个和日常用的=和!=差不多 。
如果表示的意思是前的话 , 这个元字符就需要出现在前面且要加一个类似于向前指的箭头通过上面两个情况的归纳 , 是不是这四个元字符就都记下来了?
到目前为止 , 正则表达式的基本内容都介绍完了 。但是文中用的例子都比较简单 , 只能帮助你理解概念 。如果感兴趣或者工作中能用到的话 , 还需要后续勤加练习 。
实际使用案例
你以为文章到总结就结束了?So naive , 我再来列举一个测试日常工作中的案例 , 将理论应用到实践(编程语言选择 Python , 因为我目前只会这个) 。
设想这么一个场景 , 在测试过程中需要获取某个时间段内某个程序的运行情况 , 从而分析出该程序的稳定性或使用频率等指标 , 该程序的日志记录完备 , 日志格式固定且已知 。这时候最佳的办法就是从该程序日志中进行相关信息的获取 。
假如该日志内容格式大概如下(注:该日志样例不是实际项目中的日志文件 , 为个人举例):
2020-02-17 11:04:34 [INFO] 接收到来自IP: 182.168.3.111的访问 , 访问的认证方式为邮箱:110232123@qq.com , 获取数据状态码1 , 获取数据12931KB2020-02-17 11:05:34 [INFO] 接收到来:自IP:182.168.3.111的访问 , 访问的认证方式为手机号:008617626045747 , 获取数据状态码2 , 获取数据0KB2020-02-17 12:04:34 [WARN] IP:182.168.3.111访问失败2020-02-17 11:04:34 [ERROR] 连接XXX服务失败 , 正在重连 。。。。
从这个日志中可以看到访问成功的IP及其认证账号、访问失败的IP、程序的错误信息 。那么我们怎么把这些数据给抓取出来呢?抓取的方法肯定有很多 , 如果此时你第一时间想到了正则表达式 , 那么恭喜你 , 通过阅读前面的文章 , 正则已经在你心中留下了痕迹 , 或者它本来就留有痕迹 。
我们先来分析一下第一条日志 , 其余的与此类似 , 有用的信息可以分成如下几个片段:
时间字符串:2020-02-17 11:04:34
日志级别:INFO
IP:182.168.3.111
认证邮箱:110232123@qq.com
状态码:1
客户端获取到的数据大小:12931KB
上面几个片段对应的正则为:
时间字符串:\d{4}-\d{2}-\d{2}\s*\d{2}:\d{2}:\d{2}
日志级别:[INFO]
IP:(\d{1,3}.){3}\d{1,3}
认证邮箱:\w+@\w+.\w+
状态码:\d+
客户端获取到的数据大小:\d+KB
上述中某几个正则其实并不严谨 , 比如IP对应的正则还可以匹配出999.999.999.999 。严谨的正则表达式是((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?) 。由于该正则太长 , 加之此处重点在于如何应用 , 故暂用其宽松版的正则表达式 。


推荐阅读