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. '