- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 re.sub()
使用一些可能导致回溯的复杂模式(由代码创建)。
在 Python 2.6 中经过一定次数的迭代后,是否有任何实用的方法来中止 re.sub
(假设未找到模式,或引发错误)?
示例(这当然是一个愚蠢的模式,但它是由复杂的文本处理引擎动态创建的):
>>>re.sub('[i1l!|](?:[^i1l!|\\w]|[i1l!|])*[l1i!|](?:[^l1i !||\\w]|[l1i!|])*[i1l!|](?:[^i1l!|\\w]|[i1l!|])*[l1i!|](?:[^ l1i!||\\w]|[l1i!|])*[i1l!|](?:[^i1l!|\\w]|[i1l!|])*[l1i!|](?:[ ^l1i!||\\w]|[l1i!|])*[i1l!|](?:[^i1l!|\\w]|[i1l!|])*[l1i!|](?: [^l1i!||\\w]|[l1i!|])*[i1l!|](?:[^i1l!|\\w]|[i1l!|])*[l1i!|](? :[^l1i!||\\w]|[l1i!|])*[i1l!|](?:[^i1l!|\\w]|[i1l!|])*[l1i!|]( :[^l1i!||\\w]|[l1i!|])*[i1l!|](?:[^i1l!|\\w]|[i1l!|])*[l1i!|] (?:[^l1i!||\\w]|[l1i!|])*[i1l!|](?:[^i1l!|\\w]|[i1l!|])*[l1i!| ](?:[^l1i!||\\w]|[l1i!|])*[i1l!|](?:[^i1l!|\\w]|[i1l!|])*[l1i! |](?:[^l1i!||\\w]|[l1i!|])*[i1l!|](?:[^i1l!|\\w]|[i1l!|])*[l1i !|](?:[^l1i!||\\w]|[l1i!|])*[i1l!|](?:[^i1l!|\\w]|[i1l!|])*[ l1i!|](?:[^l1i!||\\w]|[l1i!|])*[i1l!|](?:[^i1l!|\\w]|[i1l!|])* [l1i!|](?:[^l1i!||\\w]|[l1i!|])*[i1l!|](?:[^i1l!|\\w]|[i1l!|]) *[l1i!|](?:[^l1i!||\\w]|[l1i!|])*[i1l!|](?:[^i1l!|\\w]|[i1l!|] )*[l1i!|](?:[^l1i!||\\w]|[l1i!|])*','*','ilililililililililililililililililililililililililililililililililil :x')
最佳答案
除了分析正则表达式的潜在灾难性回溯(外部正则表达式的难题)或使用不允许回溯的不同正则表达式引擎之外,我认为唯一的方法是使用这种性质的超时:
import re
import signal
class Timeout(Exception):
pass
def try_one(pat,rep,s,t=3):
def timeout_handler(signum, frame):
raise Timeout()
old_handler = signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(t)
try:
ret=re.sub(pat, rep, s)
except Timeout:
print('"{}" timed out after {} seconds'.format(pat,t))
return None
finally:
signal.signal(signal.SIGALRM, old_handler)
signal.alarm(0)
return ret
try_one(r'^(.+?)\1+$', r'\1' ,"a" * 1000000 + "b")
尝试替换大量重复的单个字符(在本例中为一百万个“a”字符)是一个 classic catastrophic regex failure .这将需要数万年才能完成(至少使用 Python 或 Perl。Awk 则不同)。
尝试 3 秒后,正常超时并打印:
"^(.+?)\1+$" timed out after 3 seconds
关于python2 re.sub : abort catastrophic pattern on backtracking,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12471169/
当我尝试在 javascript 中运行以下代码时,浏览器由于灾难性的回溯而挂起,回溯无限循环可能是因为设计不当的正则表达式。我需要一个替代表达式或一种方法来防止这个问题: string temp =
我正在尝试使用从 http://daringfireball.net/2010/07/improved_regex_for_matching_urls 获得的 URL 匹配正则表达式 (?xi) \b
我正在尝试运行一个 VBScript 脚本,该脚本使用了一个已有 7 年历史的第 3 方 32 位 COM 组件在 Windows Server 2008 R2 上,命令行 32 位脚本宿主 SysW
我对此非常认真:我在 IDE 中编辑代码时遇到了“灾难性失败”!什么会导致这种情况?看起来错误是从这里开始的:Forms.TApplication.ActivateHint 好了,重启后IDE就可以工
我有一个带有 4 个接口(interface)的 Delphi ActiveX 项目。其中两个拥有用于其 CoClass 的 AutoComObject 工厂。接口(interface)的所有方法均通
我有一个相当笼统的问题,所以如果它有点含糊,请原谅。 因此,让我们假设一个 1GB 的文件需要在给定的系统上加密然后解密。 问题是系统的可用内存少于 512 mb 和大约 1.5 GB 的存储空间(给
我有一个实用程序类,其中包含一些与 XML 模式相关的方法。在没有任何代码更改或对环境进行任何已知更改的情况下,它突然开始系统性失败。 失败的方法: public static XmlSchema G
正如标题所说,每当我在打开某个窗体时调试项目时,VS2008 总是让我崩溃。我将另一个 VS2008 实例附加到它并发现以下异常是罪魁祸首: System.Runtime.InteropService
我正在使用 re.sub()使用一些可能导致回溯的复杂模式(由代码创建)。 在 Python 2.6 中经过一定次数的迭代后,是否有任何实用的方法来中止 re.sub(假设未找到模式,或引发错误)?
我正在为 Windows 8 WinRT 框架开发。以下示例代码抛出异常: 灾难性故障(HRESULT 异常:0x8000FFFF (E_UNEXPECTED)) 这是当前 WinRT 框架中的另一个
我正在使用 node.js dom-parser,它(不理想地)使用正则表达式将标签从 DOM 中拉出。 您可以在以下位置找到 dom-parser: https://github.com/ersho
我在 Windows 10 应用程序中显示 MapControl。 它在 Windows 10 桌面上完美运行,但如果我点击 map ,Windows 10 Phone 模拟器出现奇怪的“灾难性故障”
Sub Test() Dim spinButton As Object Set spinButton = ActiveSheet.OLEObjects.Add(ClassType:="
我遇到了这个错误:在 .Net Framework 4.0 中尝试使用旧 DLL 如果我将项目目标类型更改为 3.5,则不会出现错误。 奇怪的是,所有这一切只发生在 VS 2010 中运行时。如果我从
我有一个 SQL Server 2008 R2 64 位,带有使用 OraOLEDB.Oracle 提供程序连接到 Oracle 12c 的链接服务器。 当我使用 OPENQUERY 从 Oracle
我在编译一段简单的代码时遇到了麻烦。详情如下: 变量声明: double q_old[3][N], q_new[3][N], u[3][N], flux[3][N+1], fl[3][N+1], fr
我是一名优秀的程序员,十分优秀!