如何在Python中优化正则表达式匹配搜索



程序

我正在构建一个程序,用于跟踪步骤定义所涵盖的要素文件步骤。例如,我可能有一个特征步骤,即I should not click on the panel。该特征步骤匹配步骤定义I {qualifier} click on the {place},假定{qualifier}映射到(should not|should)并且{place}映射到(panel|page)

对于与步骤定义匹配的每个特征步骤,我希望跟踪它实际与哪个步骤定义匹配。所以我需要在I should not click on the panelI {qualifier} click on the {place}之间建立连接。

对于每一个与任何步骤定义都不匹配的特征步骤,我将生成一个步骤定义并连接这两个步骤。

问题

现在,我对每一个步骤进行定义,并将它们转换为正则表达式,类似于。。。

I {qualifier} click on the {place}将转换为(I (should not|should) click on the (panel|page))

我使用的是Python字典,其中键是转换后的正则表达式,值是原始步骤定义。

当我经历每一个功能步骤并试图将它们连接到匹配的步骤定义时,我的问题就出现了。我现在只是循环浏览每一个正则表达式,并试图将其与功能步骤相匹配,类似于这样。。。

# every feature_step gets sent through this check
for regex in all_step_definition_regex:
if re.match(regex, feature_step):
step_definition = regex_to_step_definition_map[regex]
return True, step_definition
return False, None

当必须检查每个特性步骤以查看它是否与任何单个正则表达式匹配时,这将花费非常长的时间来运行。加快初始检查的一种方法是用类似re.match('|'.join(all_step_definition_regex), feature_step)的"或"将每个正则表达式连接在一起,但如果不循环返回所有单个正则表达式,我就无法将特征步骤与其匹配的步骤定义连接起来。

我想知道是否有人知道如何加快这个过程?

您可以将每个定义模式设为一个组,然后查看匹配的组,尽管您需要更改单个正则表达式以使用非捕获组(?:((如果不使用信息,在任何情况下都会更高效(:

definition_regex = re.compile(r'(' + r')|('.join(all_step_definition_regex) + r')')
def find_definition(feature_step):
match = definition_regex.match(feature_step)
if match is None:
return None
return match.lastindex - 1

最新更新