簡體   English   中英

如何優化 Python 中的正則表達式匹配搜索

[英]How to optimize a regular expression match search in 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM