我有一个需要简化的复合和简单正则表达式列表。让我们说["(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困难的,当然不能用另一个正则表达式解决。您最多只能应用一些非常有限的特殊情况。