gpt4 book ai didi

python - 在python中删除带有嵌套子括号的双波浪括号之间的数据

转载 作者:太空狗 更新时间:2023-10-29 17:31:53 26 4
gpt4 key购买 nike

我在解决这个问题时遇到了一些困难。我需要删除波浪括号中包含的所有数据。

像这样:

Hello {{world of the {{ crazy}} {{need {{ be}}}} sea }} there.

变成:

Hello there.

这是我的第一次尝试(我知道这很糟糕):

while 1:
firstStartBracket = text.find('{{')
if (firstStartBracket == -1):
break;
firstEndBracket = text.find('}}')
if (firstEndBracket == -1):
break;
secondStartBracket = text.find('{{',firstStartBracket+2);
lastEndBracket = firstEndBracket;
if (secondStartBracket == -1 or secondStartBracket > firstEndBracket):
text = text[:firstStartBracket] + text[lastEndBracket+2:];
continue;
innerBrackets = 2;
position = secondStartBracket;
while innerBrackets:
print innerBrackets;
#everytime we find a next start bracket before the ending add 1 to inner brackets else remove 1
nextEndBracket = text.find('}}',position+2);
nextStartBracket = text.find('{{',position+2);
if (nextStartBracket != -1 and nextStartBracket < nextEndBracket):
innerBrackets += 1;
position = nextStartBracket;
# print text[position-2:position+4];
else:
innerBrackets -= 1;
position = nextEndBracket;
# print text[position-2:position+4];
# print nextStartBracket
# print lastEndBracket
lastEndBracket = nextEndBracket;
print 'pos',position;
text = text[:firstStartBracket] + text[lastEndBracket+2:];

它似乎可以工作,但很快就会耗尽内存。有没有更好的方法来做到这一点(希望使用正则表达式)?

编辑:我不清楚所以我再举一个例子。我需要允许多个顶级括号。

像这样:

Hello {{world of the {{ crazy}} {{need {{ be}}}} sea }} there {{my }} friend.

变成:

Hello there friend.

最佳答案

这是一个基于正则表达式/生成器的解决方案,适用于任意数量的大括号。这个问题不需要实际的堆栈,因为只涉及一种类型(好吧,一对)的 token 。 level 扮演堆栈将扮演更复杂的解析器的角色。

import re

def _parts_outside_braces(text):
level = 0
for part in re.split(r'(\{\{|\}\})', text):
if part == '{{':
level += 1
elif part == '}}':
level = level - 1 if level else 0
elif level == 0:
yield part

x = 'Hello {{world of the {{ crazy}} {{need {{ be}}}} sea }} there. {{ second set {{ of }} braces }}'
print(''.join(_parts_outside_braces(x)))

更一般的要点...正则表达式中的捕获组是使大括号出现在 re.split 输出中的原因,否则你只会得到介于两者之间的东西。也有一些对不匹配的括号的支持。对于严格的解析器,这应该引发异常,因为应该在级别 > 0 的字符串末尾运行。对于松散的 Web 浏览器样式解析器,也许您想要显示那些 }} 作为输出...

关于python - 在python中删除带有嵌套子括号的双波浪括号之间的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35615847/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com