最近在项目中遇到一个问题,就是需要采用正则匹配一些疑似暗链和挂马的HTML代码,而公司的老大给的正则表达式有的地方写的不够严谨,导致在匹配的时候发生卡死的现象,而后面的逻辑自然无法执行了。虽然用正则表达式来判断暗链和挂马可能不那么准确或者行业内很少有人那么做,但是本文不讨论如何使用正确的姿势判断暗链挂马,只关注与正则超时的处理。

在使用正则表达式的时候,如果正则写的太糟糕,所消耗的时间是惊人的,并且有可能会一直回溯,而产生卡死的现象,所以一般的大型公司都会有专门的人来对正则进行优化,从而提高程序效率。一般来说如果可能的话不要让用户来输入正则进行匹配。但是现在既没有专门的人进行正则的优化,本人也对正则了解的不够,所以只能从另外的角度来考虑处理超时的问题。
首先我想到的方法是另外开启一个线程来进行匹配,而在主线程中进行等待,如果发现子线程在规定的时间内没有返回就kill掉子线程。这也是一个方案,但是我现在要介绍另外一种方案,该方案来自我在网上看到的一篇博客.

博客地址:https://blog.lilydjwg.me/2013/5/25/set-a-time-limit-for-python-regex-matching.39335.html

该博客给出了另外一种办法,就是采用信号的方式,在正则匹配之前定义一个信号,并规定触犯时间和处理的函数,如果在规定时间内程序没有结束那么触发一个TimeoutError的异常,而主线程收到这个异常时就会中断执行,并处理这个异常,这样就从正则匹配中解脱出来,达到了我们要的结果。这个方法有两个不足之处:

  1. 信号这个东西是Linux独有的,在Windows下不适用

  2. 信号只能在主线程中使用,而如果在子线程中进行正则匹配,那么这个方法就不适用

我的项目正在运行在Linux系统上,所以针对第一个不足来说可以接受,但是我的正则匹配都是在子线程中,所以乍看之下这个方案也不太靠谱,但是好在我在后面的评论中发现博主给出了针对第二种不足的解决方案——开辟一个子进程,将正则匹配放到子线程中,这样一来可以充分利用多核(毕竟Python中的多线程是个伪多线程),二来可以分方便的使用该方案解决问题,下面是实际的代码

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import re
import multiprocessing
import signaldef time_out(b, c):raise TimeoutErrordef search_with_timeout(pipe, word, value):signal.signal(signal.SIGALRM, time_out)signal.alarm(1)r = re.compile(word)try:ret = r.search(value, re.I)b_ret = True if ret != None else Falsepipe.send(b_ret)except TimeoutError:pipe.send(False)

在上面的代码中先的定义了一个信号,给定1s中以后触发,触发的函数为time_out然后执行正则表达式,如果在这1s中内无法完成,那么处理函数会被调用,会跑出一个异常,此时主线程终止当前任务的执行,进入到异常处理流程,这样就可以终止正则匹配,从而正常的返回。由于这个部分是一个新进程自然就涉及到不同进程之间的通信,在这个例子中我使用了管道进行通信。由于Python在创建子进程的时候可以进行参数的传入所以我只需要一个管道将数据从子进程中写入,再从朱金城中读取就好了。
下面是调用该子进程的代码:

pipe = multiprocessing.Pipe()
p = multiprocessing.Process(target = search_with_timeout, args = (pipe[0], word, left_value))
p.start()
p.join() #等待进程的结束
ret =  pipe[1].recv() #获取管道中的数据

Python处理正则表达式超时的办法相关推荐

  1. Python中正则表达式用法 重点格式以这个为准_首看_各种问题

    20210811 https://www.jb51.net/article/101258.htm 一.惰性模式的概念: 此模式和贪婪模式恰好相反,它尽可能少的匹配字符以满足正则表达式即可,例如: va ...

  2. python使用正则表达式判别字符串是否以一个大写字符起始而跟随了一些小写字符

    python使用正则表达式判别字符串是否以一个大写字符起始而跟随了一些小写字符 # # Python3 code to find sequences of one upper # case lette ...

  3. python使用正则表达式统计字符串中出现次数最多的数字

    python使用正则表达式统计字符串中出现次数最多的数字 #python使用正则表达式统计字符串中出现次数最多的数字 # find the most occurring element import ...

  4. python使用正则表达式识别大写字母并在大写字母前插入空格

    python使用正则表达式识别大写字母并在大写字母前插入空格 #python使用正则表达式识别大写字母并在大写字母前插入空格 import redef putSpace(input):# regex ...

  5. python使用正则表达式删除字符串中的其它字符只保留数字和字母

    python使用正则表达式删除字符串中的其它字符只保留数字和字母 #python使用正则表达式删除字符串中的其它字符只保留数字和字母 # Python code to demonstrate # to ...

  6. python使用正则表达式寻找具有特定后缀的文件

    python使用正则表达式寻找具有特定后缀的文件 # python使用正则表达式寻找具有特定后缀的文件 # import library import re# list of different ty ...

  7. python使用正则表达式抽取字符串中最大数值数字

    python使用正则表达式抽取字符串中最大数值数字 #python使用正则表达式抽取字符串中最大数值数字 # Function to extract maximum numeric value fro ...

  8. python使用正则表达式去除句子中的重复词

    python使用正则表达式去除句子中的重复词 #python使用正则表达式去除句子中的重复词 # Python program to remove duplicate words # using Re ...

  9. python使用正则表达式检测给定的URL地址是否合法

    python使用正则表达式检测给定的URL地址是否合法 # python使用正则表达式检测给定的URL地址是否合法 # python使用正则表达式检测给定的URL地址是否合法 # Check if a ...

最新文章

  1. python123程序设计题说句心里话_用c++写一个简单的计算器程序
  2. 啊,我南非时间上午10点看成了。。
  3. php 0-1,PHP 动态解决0-1背包问题
  4. aix6.1 nfs
  5. 事件传递 java_将事件传递/发送到父组件?
  6. linux系统sed语法,22. Linux sed命令
  7. 中国可打印标签市场趋势报告、技术动态创新及市场预测
  8. [swift] LeetCode 206. Reverse Linked List
  9. 基于FPGA实现uart串口模块——进阶版1
  10. c++11 多线程编程(三)------ 竞争和互斥锁
  11. 【POJ1442】Black Box
  12. 三星s6 html5测试分数,魅蓝s6安兔兔跑分有多少
  13. Controller中servletFileUpload.parseRequest(request)解析为空
  14. 计算机组装与维护精品,国家精品课程——《计算机组装与维护》.pdf
  15. sklearn 1.0.1官方文档教程
  16. iOS微信消息延迟和不提醒,这样即可解决
  17. 用计算机算平米怎么算,平米换算亩怎么算(平方米换算亩计算器)
  18. Vue3 学习笔记 —— transition、transition-group
  19. 从搜索引擎角度看SEO
  20. Visual Studio 2022调节字体大小

热门文章

  1. 【Vegas原创】获取远程数据库到本地
  2. linux下修改主机名
  3. Visual Studio 2008 每日提示(三十二)
  4. HANA数据库为何如此之快
  5. ABAP 关于ALV布局保存选项的讲解
  6. 企业使用MES系统的好处以及使用前后的区别
  7. SAP ECC 6.0有哪些增强功能
  8. SM35/BDC Record / Log 导出
  9. 2015各地高温补贴发放标准时间一览表
  10. Idoc学习笔记----获取查询Idoc信息