我有一个需要简化的复合和简单正则表达式的列表。让我们说["(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)"]
答案 0 :(得分:0)
我在编译此模式时遇到的错误是“多次重复”,指的是模式\w+{1}
。这种模式确实确实没有任何意义-您基本上是将两个重复方向(+
,至少一次,{1}
,恰好一次)应用于同一个表达式\w
。 / p>
如果需要的话,可以像在(\w+){1}
中那样在其周围加上括号,但是应该知道,在正则表达式中的任何地方放置{1}
都是多余的; <expression>{1}
等同于<expression>
。
(注意:更一般而言,您要解决的问题-正则表达式的最小化-至少是NP困难的,并且当然不能用其他正则表达式解决。您最多可以应用一些非常有限的特殊情况)