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

时间:2019-05-29 14:52:36

标签: python regex

我有一个需要简化的复合和简单正则表达式的列表。让我们说["(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)"]

1 个答案:

答案 0 :(得分:0)

我在编译此模式时遇到的错误是“多次重复”,指的是模式\w+{1}。这种模式确实确实没有任何意义-您基本上是将两个重复方向(+,至少一次,{1},恰好一次)应用于同一个表达式\w。 / p>

如果需要的话,可以像在(\w+){1}中那样在其周围加上括号,但是应该知道,在正则表达式中的任何地方放置{1}都是多余的; <expression>{1}等同于<expression>

(注意:更一般而言,您要解决的问题-正则表达式的最小化-至少是NP困难的,并且当然不能用其他正则表达式解决。您最多可以应用一些非常有限的特殊情况)