Python 删除()和[]之间的文本

Python 删除()和[]之间的文本,python,python-2.7,Python,Python 2.7,我有一个非常长的文本字符串,其中包含()和[]。我试图删除括号和方括号之间的字符,但我不知道如何删除 清单与此类似: x = "This is a sentence. (once a day) [twice a day]" 这个列表不是我正在使用的,但是非常相似,而且要短得多。这应该适用于括号。正则表达式将“使用”已匹配的文本,因此它不适用于嵌套括号 import re regex = re.compile(".*?\((.*?)\)") result

我有一个非常长的文本字符串,其中包含
()
[]
。我试图删除括号和方括号之间的字符,但我不知道如何删除

清单与此类似:

x = "This is a sentence. (once a day) [twice a day]"

这个列表不是我正在使用的,但是非常相似,而且要短得多。

这应该适用于括号。正则表达式将“使用”已匹配的文本,因此它不适用于嵌套括号

import re
regex = re.compile(".*?\((.*?)\)")
result = re.findall(regex, mystring)
或者这会找到一组括号,只需循环查找更多:

start = mystring.find("(")
end = mystring.find(")")
if start != -1 and end != -1:
  result = mystring[start+1:end]

运行此脚本,它甚至可以与嵌套的括号一起工作。
使用基本的逻辑测试

def a(test_str):
    ret = ''
    skip1c = 0
    skip2c = 0
    for i in test_str:
        if i == '[':
            skip1c += 1
        elif i == '(':
            skip2c += 1
        elif i == ']' and skip1c > 0:
            skip1c -= 1
        elif i == ')'and skip2c > 0:
            skip2c -= 1
        elif skip1c == 0 and skip2c == 0:
            ret += i
    return ret

x = "ewq[a [(b] ([c))]] This is a sentence. (once a day) [twice a day]"
x = a(x)
print x
print repr(x)
以防万一你不运行它,
以下是输出:

>>> 
ewq This is a sentence.  
'ewq This is a sentence.  ' 

您可以使用re.sub函数

>>> import re 
>>> x = "This is a sentence. (once a day) [twice a day]"
>>> re.sub("([\(\[]).*?([\)\]])", "\g<1>\g<2>", x)
'This is a sentence. () []'
重要提示:此代码不适用于嵌套符号

解释 第一个正则表达式将
[
分为第1组(用括号括起来)和
]
分为第2组,匹配这些组和它们之间的所有字符。匹配后,匹配的部分被第1组和第2组替换,最后的字符串在括号内没有任何内容。第二个正则表达式是不言自明的->匹配所有内容并替换为空字符串


--修改自

这里有一个类似的解决方案(它适用于任意嵌套的括号):

def删除方括号内的文本(文本,方括号=“()[]”):
计数=[0]*(len(括号)//2)#计数开/关括号
已保存的字符=[]
对于文本中的字符:
对于枚举中的i,b(括号):
如果字符==b:#找到括号
种类,is_close=divmod(i,2)
计数[种类]+=(-1)**是否关闭?`+1`:打开,`-1`:关闭
如果计数[种类]<0:#不平衡括号
计数[种类]=0#保留它
否则:#找到要移除的支架
打破
else:#字符不是[平衡]括号
如果没有(计数):#括号外
已保存的字符追加(字符)
返回“”。加入(已保存的字符)
打印(报告)(删除括号内的文字(
“这是一句话(一天一次)[一天两次]”)
#->“这是一句话。”

您可以再次拆分、筛选和加入字符串。如果括号定义得很好,那么下面的代码就可以了

重新导入
x=“”.join(重新拆分(“\(\\)\[\\”,x)[::2])

请展示您尝试过的内容(通过编辑您的问题而不是添加注释),人们会为您指出正确的方向。可以嵌套
()
[]
,例如,
“[a[(b]([c))]””
?如果
x=“ewq[a[(b]([c))]”,则不起作用,它给出了
'ewq]]'
而不是
'eqw'
。@paddila我知道,但是Tic没有说任何关于嵌套符号的事。我向他询问了此事。。他没有回答yetcan有人解释这里使用的正则表达式吗?@Markrox将第一个正则表达式组“(”和“]”放入组1(用括号括起来),将“””和“]”放入组2,匹配这些组以及两个组之间的所有字符。匹配后,匹配的部分被第1组和第2组替换,最后的字符串在括号内没有任何内容。第二个正则表达式是不言自明的->匹配所有内容并替换为空字符串。希望如此helps@J.F.Sebastian对做出了改变。乍看起来很复杂,但比我的(当然是公认的(我的意见))好。我不知道为什么这个答案被标记为正确。问题在于要求删除文本,而不是返回文本。我也有同样的需要(删除某些字符之间的文本),@jvallver的回答帮助了我。这与OP要求的相反
>>> import re 
>>> x = "This is a sentence. (once a day) [twice a day]"
>>> re.sub("[\(\[].*?[\)\]]", "", x)
'This is a sentence.  '
def remove_text_inside_brackets(text, brackets="()[]"):
    count = [0] * (len(brackets) // 2) # count open/close brackets
    saved_chars = []
    for character in text:
        for i, b in enumerate(brackets):
            if character == b: # found bracket
                kind, is_close = divmod(i, 2)
                count[kind] += (-1)**is_close # `+1`: open, `-1`: close
                if count[kind] < 0: # unbalanced bracket
                    count[kind] = 0  # keep it
                else:  # found bracket to remove
                    break
        else: # character is not a [balanced] bracket
            if not any(count): # outside brackets
                saved_chars.append(character)
    return ''.join(saved_chars)

print(repr(remove_text_inside_brackets(
    "This is a sentence. (once a day) [twice a day]")))
# -> 'This is a sentence.  '