对于双括号或三括号,如何删除括号中的所有值

时间:2015-06-08 09:51:51

标签: python

我通过抓取获得随机文本,但是,我必须删除括号中的所有值

像这样

string = "I(have[to]re(m[ov]e)all)value(in)[bracket]"

到string = "Ivalue"

因为我应该删除所有已抓取字符串的括号中的值,我得到了"[(""])"的索引数据 在单支架的情况下,它运作良好。 但是,如果是双支架或三支架,则效果不佳。

我的代码就像这样

for i in range(len(contents_re[0])):
for j in range(len(trash_index[i][0])-1):
    if trash_index[i][0][j+1] < trash_index[i][1][j]:
        trash_index_re[i][0].append(trash_index[i][0][j])
        trash_index_re[i][1].append(trash_index[i][1][j+1])
    elif trash_index[i][0][j+1] > trash_index[i][1][j]:
        trash_index_re[i][0].append(trash_index[i][0][j])
        trash_index_re[i][1].append(trash_index[i][1][j])
来自索引数据(trash_index[i][0] = contains "([" index data.)

我试图找到最终索引(trash_index_re "([()])blah()" -> ( )blah())

3 个答案:

答案 0 :(得分:1)

这是一个直接解决方案,它会分解字符串然后迭代它。它不处理不匹配的括号。它很可能不是最好的。

import re

i = "I(have[to]re(m[ov]e)all)value(in)[bracket]"
t = []

depth = 0
for token in re.split(r'([\[\]\(\)])', i):
   if token in ('(', '['):
      depth = depth + 1
   if depth == 0:
      t.append(token)
   if token in (')', ']'):
      depth = depth - 1

print ''.join(t)

打印:

Ivalue

答案 1 :(得分:1)

由于您可能在括号内有很多嵌套字符串,因此您可以使用递归函数和re.sub替换每个调用中的外部括号:

>>> def spliter(s):
...     new=re.sub(r"\([^()]*?\)|\[([^\[\]]*?)\]","",s)
...     if any(i in new for i in ')[]('):
...        return spliter(re.sub(r"\([^()]*?\)|\[([^\[\]]*?)\]","",new))
...     else : 
...        return new
... 
>>> s="I(have[to]re(m[ov]e)all)value(in)[bracket]"
>>> spliter(s)
'Ivalue'
>>> s="I(have[to]re(m[ov]e)all(asfref)(efsf[ekjfrehf]sef)(dfsd))value(in)[bracket]"
>>> spliter(s)
'Ivalue'
>>> s="I(have[to]re(m[ov]e)all(asfref)(efsf[ekj(9387jjdf)frehf]sef)(dfsd))value(in)[bracket]"
>>> spliter(s)
'Ivalue'

以下正则表达式:

r"\([^()]*?\)|\[([^\[\]]*?)\]"

将使用空字符串替换除括号和括号内的任何内容。

答案 2 :(得分:0)

您的问题主要涉及删除嵌套括号内的文本。假设只有圆形或方括号(可以正确关闭),您可以使用此question中提到的以下代码:

import itertools

def remove_brackets(t):
  p = []
  d = 0
  l = []
  for c in t:
    if c == '[' or c == '(': d += 1
    l.append(d)
    if c == ']' or c == ')': d -= 1
  for k, g in itertools.groupby(zip(t, l), lambda x: x[1]>0):
    b = list(g)
    if max(d for c, d in b) > 0: continue
    p.append(''.join(c for c, d in b))
  print ''.join(p)

remove_brackets(string)

如果您只想删除单个代码中的文字,可以使用regex

result = re.sub("[\(\[].*?[\)\]]","",string)