2017-03-17 193 views
-1

例如输入字符串:Python。如何删除多余的/错误的括号中的字符串

s = "fo)o)fus()(bar((em)ro(em))dah((y(XXX)"

因此,我预计:

fus()((em)ro(em))dah(XXX)

这就像结果应该包含所有“健康”块,它们之间打开“(”和“关闭”)“+”健康“文本。所有生病的部位应该被删除:“fo)”和“o)”,因为它们不涉及“()”,它们不在“()”之间或不包含在“()”中。

例如对于检查:

z = "))(OMG)123(()qwe(zxc)(ll"

应该返回 (OMG)123()qwe(zxc)

我会认为它可以解决与re模块楷书。但我不知道应该使用哪种算法。注:我不会拒绝任何帮助。 :)

+0

到目前为止你有什么想法? – Jan

+0

我试着翻译括号来增加/减少数字,用索引映射它并得到应该包含的部分。 ()()(y(XXX)“ -1 -2 -1 -2 -1 0 1 0 1 0 -1 -2 -1 0 1 0 –

+0

如果进入反向模式: 索引从x增加到x + 1 - >应该加上,否则 - >不是 –

回答

1

有一个非常好的例子,使用堆栈,几乎每个CS学生至少解决了一次。以this为例,但您可以找到更好的语法(专门为C++编写)。

这些解决方案通常用于检查语句是否正确,但您可以使用相同的逻辑删除错误的部分并只保存匹配的部分。因此,只需创建新的字符串变量(variable=""),遍历字符串并检查括号,如果它们位于正确的位置,然后将它们添加到该变量。要检查括号顺序,使用Stack对象,当你看到左括号把它推入堆栈,然后继续,当它将关闭一个,然后弹出堆栈中的最后一个值并检查(新项目是)和堆栈中的最后一项应该是()。如果它们不匹配,扔掉那部分并继续,如果它们匹配,则将该部分添加到字符串中。

+0

hm ...,好的线索我会尝试使用它 –

+0

是否适用于'“(abc”'? –

+1

@EricDuminil是的,如果在将其添加到主变量之前创建临时字符串,那么当循环将会和没有括号时,temp不会被添加到主要字符串等问题都将被解决,所以想法是将括号之间的所有字符串收集到temp中,并且当括号将被关闭时,它会将其转换为主字符串,清理temp并继续循环。 –

相关问题