我通过抓取获得随机文本,但是,我必须删除括号中的所有值
像这样 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())
答案 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)