

给 Python 的正则匹配限制执行时间
source link: https://blog.lilydjwg.me/2013/5/25/set-a-time-limit-for-python-regex-matching.39335.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

给 Python 的正则匹配限制执行时间
本文来自依云's Blog,转载请注明。
看到这个标题,你也许会想,这个需要限制么?不是很快就出来结果了么?
感谢 Just Great Software,虽然我没买它的产品,但是其说明书(可免费下载)中的正则教程详细地论述了这点。所以我在自己的 xmpptalk 机器人中一直不敢接受用户输入的正则表达式。引述其中的一句话:「People with little regex experience have surprising skill at coming up with exponentially complex regular expressions.」(不太懂正则的人经常能令人惊奇地写出指数级复杂度的正则。)
但很不幸,我从这里抄到的匹配网址的正则就有这种问题。在将其的修改版给我的 XMPP 机器人 Lisa 使用后,Lisa 两次被含有括号的链接搞到没响应……
所以,如果要使用用户输入的正则,我必须限制其匹配时间。方法也很简单——使用信号就可以了。当 Python 在匹配正则时如果收到信号,会转而调用信号处理器,然后再接着匹配。如果信号处理器抛出了异常,那么此异常会传播到调用正则匹配的地方,从而中断匹配操作。
示例如下:
#!/usr/bin/env python3
import
re
# import regex as re
import
signal
def
timed_out(b, c):
print
(
'alarmed'
)
raise
RuntimeError()
signal.signal(signal.SIGALRM, timed_out)
signal.setitimer(signal.ITIMER_REAL,
0.1
,
0
)
s
=
'<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>'
r
=
re.
compile
(r
'''(?:<(?:[^<>]+)*>)+b'''
)
try
:
r.findall(s)
except
RuntimeError:
print
(
'time exceeded'
)
被注释掉的那句是调用mrab-regex-hg这个正则引擎的;它不会回溯时出这种问题。
优化下代码,写成库方便使用(使用了TimeoutError
,所以适用于 Python 3.3+):
import
contextlib
import
signal
@contextlib
.contextmanager
def
execution_timeout(timeout):
def
timed_out(signum, sigframe):
raise
TimeoutError
old_hdl
=
signal.signal(signal.SIGALRM, timed_out)
old_itimer
=
signal.setitimer(signal.ITIMER_REAL, timeout,
0
)
yield
signal.setitimer(signal.ITIMER_REAL,
*
old_itimer)
signal.signal(signal.SIGALRM, old_hdl)
Recommend
-
70
前言 正则在js中是一类比较特殊的对象,它可以匹配各个场景需要的格式验证,例如邮箱、手机号、用户登录名、密码等等,似乎无处不在,在常见的字符串检索或替换中,我们需要提供一种模式表示检索或替换的规则,来匹配一系列符合某个句法规则的字符串。 以下是正则...
-
35
正则表达式匹配任意字符(包括换行符) 2019-7-30 20:1:39 | 作者: 月光 | 分类:
-
17
前言:网络上SQL注入绕过WAF的帖子文章纷繁多样,良莠不齐,眉毛胡子一把抓,各种姿势让人眼花缭乱。于是,便有学生问我,SQL注入绕过WAF的最本质原理是什么……. 0X01 WAF介绍 要从本质上回答SQL注入...
-
27
网上看过不少代码的教程,有些按照步骤来一段段代码解读 (篇幅会很长) ,有些会简化代码来讲解,然后逐步扩展 (篇幅也会很长) ,有些干脆直接源代码放出来,在上面注解。...
-
6
Python爬虫编程思想(29):正则表达式的匹配(match)与搜索(search) ...
-
4
python 正则匹配任意字符的一个坑 – 哈呜.王 错误: .* 是匹配除了换行符\n以外的所有字符。 正确: 正确匹配任意字符的表达式应该是 [\s\S]*...
-
7
Python高级(20)—正则表达式简介,匹配字符串及预编译◎知识点正则表达式的简介使用re模块实现字符串的匹配正则表达式的预编...
-
13
Python高级(21)—单个字符的匹配、正则表达式与原始字符串◎知识点单个字符的匹配正则表达式与原始字符串◎脚本练习...
-
8
Python高级(22)—正则表达式匹配◎知识点贪婪匹配与勉强匹配分组匹配逻辑匹配◎脚本练习
-
4
Python高级(25)—正则边界匹配、Match对象的属性和方法◎知识点正则表达式边界匹配Match对象的属性和方法◎脚本练习
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK