我在这个问题上有些困难。我需要删除所有包含在乱七八糟的括号中的数据。
像这样:
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:];它看起来很管用,但是内存很快就用完了。有什么更好的方法来做到这一点(希望通过regex)?
编辑:我不清楚,所以我再举一个例子。我需要允许多个顶级括号。
像这样:
Hello {{world of the {{ crazy}} {{need {{ be}}}} sea }} there {{my }} friend.变成:
Hello there friend.发布于 2016-02-25 00:34:48
这是一个基于正则表达式/生成器的解决方案,适用于任意数量的大括号。此问题不需要实际的堆栈,因为只涉及1种类型(好,一对)的令牌。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)))更一般的观点..。regex中的捕获组使大括号出现在re.split的输出中,否则只能在中间得到大括号。也有一些支持不匹配的大括号。对于严格的解析器,这应该会引发异常,级别> 0的字符串结束时也会出现异常。对于一个松散的web浏览器风格的解析器,您可能希望将这些}}显示为输出.
发布于 2016-02-25 00:21:51
您可以在这里使用模块。基于这个答案的解决方案
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)))指纹:
Hello there friend.只有当只有一副顶级的大括号时,以下的方法才能起作用。
如果要删除带大括号本身的双花括号内的所有内容:
>>> import re
>>>
>>> s = "Hello {{world of the {{ crazy}} {{need {{ be}}}} sea }} there."
>>> re.sub(r"\{\{.*\}\} ", "", s)
'Hello there.'\{\{.*\}\}将匹配双大括号,后面是任何字符(有意将其保留为“贪婪”),然后是双大括号和空格。
发布于 2016-02-25 00:23:33
尝试以下代码:
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)https://stackoverflow.com/questions/35615847
复制相似问题