首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python中删除带嵌套子括号的双曲括号之间的数据

在python中删除带嵌套子括号的双曲括号之间的数据
EN

Stack Overflow用户
提问于 2016-02-25 00:15:04
回答 7查看 1.2K关注 0票数 13

我在这个问题上有些困难。我需要删除所有包含在乱七八糟的括号中的数据。

像这样:

代码语言:javascript
复制
Hello {{world of the {{ crazy}} {{need {{ be}}}} sea }} there.

变成:

代码语言:javascript
复制
Hello there.

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

代码语言:javascript
复制
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:];

它看起来很管用,但是内存很快就用完了。有什么更好的方法来做到这一点(希望通过regex)?

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

像这样:

代码语言:javascript
复制
Hello {{world of the {{ crazy}} {{need {{ be}}}} sea }} there {{my }} friend.

变成:

代码语言:javascript
复制
Hello there friend.
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2016-02-25 00:34:48

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

代码语言:javascript
复制
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)))

更一般的观点..。regex中的捕获组使大括号出现在re.split的输出中,否则只能在中间得到大括号。也有一些支持不匹配的大括号。对于严格的解析器,这应该会引发异常,级别> 0的字符串结束时也会出现异常。对于一个松散的web浏览器风格的解析器,您可能希望将这些}}显示为输出.

票数 4
EN

Stack Overflow用户

发布于 2016-02-25 00:21:51

您可以在这里使用模块。基于这个答案的解决方案

代码语言:javascript
复制
from pyparsing import nestedExpr


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

expr = nestedExpr('{{', '}}')
result = expr.parseString("{{" + s + "}}").asList()[0]
print(" ".join(item for item in result if not isinstance(item, list)))

指纹:

代码语言:javascript
复制
Hello there friend.

只有当只有一副顶级的大括号时,以下的方法才能起作用。

如果要删除带大括号本身的双花括号内的所有内容:

代码语言:javascript
复制
>>> import re
>>> 
>>> s = "Hello {{world of the {{ crazy}} {{need {{ be}}}} sea }} there."
>>> re.sub(r"\{\{.*\}\} ", "", s)
'Hello there.'

\{\{.*\}\}将匹配双大括号,后面是任何字符(有意将其保留为“贪婪”),然后是双大括号和空格。

票数 4
EN

Stack Overflow用户

发布于 2016-02-25 00:23:33

尝试以下代码:

代码语言:javascript
复制
import re

s = 'Hello {{world of the {{ crazy}} {{need {{ be}}}} sea }} there'
m = re.search('(.*?) {.*}(.*)',s)
result = m.group(1) + m.group(2)
print(result)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35615847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档