使用 python 正则表达式简化复合正则表达式



我有一个需要简化的复合和简单正则表达式列表。让我们说["(crazy|cute|funny)( w+){0,5} cat", "I love( w+){0,5} cats)"].我需要确定具有特定模式的那些。例如,我想识别包含 or("|"( 的那些 并将它们简化为单一模式。

在上面的例子中,我想将"(crazy|cute|funny)( w+){0,5} cat转换为["crazy( w+){0,5} cat", "cute( w+){0,5} cat", "funny( w+){0,5} cat"]。我不想改变"I love( w+){0,5} cats)"因为它是一个简单且不复合的正则表达式。

我想出了以下正则表达式来识别此类示例:

re = "((w+{1}|){1,10}w+{1})" 

但它没有识别它们。我不确定出了什么问题。

def sep_rules(search_list):
    new_query_list = list()
    for item in search_list:
        if "|" not in item:
            new_query_list.append(item)
        else:
            re = "((w+{1}|){1,10}w+{1})"
            print item 
            print re_search(item, re) # does not identify them correctly 

输入数据:

["(crazy|cute|funny)( w+){0,5} cat", "I love( w+){0,5} cats)"] 

预期产出:

["crazy( w+){0,5} cat" , "cute( w+){0,5} cat" , "funny( w+){0,5} cat" , "I love( w+){0,5} cats)"]

编译此模式时遇到的错误是"多次重复",指的是模式w+{1}。这种模式确实没有意义 - 你基本上将两个重复方向(+,至少一次,{1},正好一次(应用于同一个表达式w

如果需要,您可以在它周围加上括号,如 (w+){1} ,但您应该意识到,在正则表达式中的任何位置{1}首先是多余的; <expression>{1}完全等同于<expression>

(注意:更一般地说,你试图解决的问题 - 正则表达式的最小化 - 至少是NP困难的,当然不能用另一个正则表达式解决。您最多只能应用一些非常有限的特殊情况。

最新更新