我有一些像这样的字符串:
"1+""2*3"*4"+"5*6""
和与一些正则表达式,答案应该是:
(1+((2*3)*4)+(5*6))
正则表达式可以这样做吗?
答案 0 :(得分:6)
如果输入的内容有效,我们可以利用这种语言的一些冗余约束来添加适当的括号。但这实际上更多是使用“技巧”。我真的建议使用更复杂的工具,例如下推自动机(因此是 parser )。
在这里我们可以发现一些东西:也就是说,如果下一个字符是数字,或者是双引号序列,后跟一个数字,则所有其他双引号。
所以我们基本上可以使用两个正则表达式来做到这一点:
但是,如果原始输入有效,此技巧仅有效。如果它在运算符周围包含双引号,例如"+"
,那么它会产生完全不同的结果。
在Python中,我们可以使用例如:
from re import sub
def add_brackets(text):
return sub(r'["](?=\"*[(\d])', '(', text).replace('"', ')')
这将给我们:
>>> add_brackets('"1+""2*3"*4"+"5*6""')
'(1+((2*3)*4)+(5*6))'
这在这里有效,因为我们只考虑数字和运算符。如果我们要添加变量,它仍然可以工作,但是如果我们添加更复杂的元素(如函数),则问题将变得更加棘手。
“递归语言”(可以根据自身定义某些元素 的语言)可以通过为此专门构造的工具push down automaton进行更好的解析。
pumping lemma for regular languages显示诸如( n ) n 之类的语言(该语言包含带有多个开括号的字符串,后跟相同数量的右括号),无法使用正则表达式进行验证。您在此处描述的语言就是一个示例。因此,此正则表达式不能够验证该正则表达式。某些编程语言(如 Perl )具有扩展的正则表达式,以便它们可以验证平衡括号。这些不是正则表达式,至少不是 Stephen Kleene 所定义的。