首页 > 解决方案 > 正则表达式排除方括号内的所有内容,但不排除大括号内的方括号内容

问题描述

我有一个包含一组字符串的列表-

mylist = ['abc','[apple','banana','cucumber]','efg','{','egg','[fff]','ginger }','end;','abc1','[','apple1','banana1','cucumber1',']','efg1','{','egg1','[fff1]','ginger1 }','end1;']

将所有字符串组合在一起以应用正则表达式以排除方括号内的内容:

newlist = ['|'.join(mylist)]

Output newlist : ['abc|[apple|banana|cucumber]|efg|{|egg|[fff]|ginger }|end;|abc1|[ |apple1|banana1|cucumber1|]|efg1|{|egg1|[fff1]|ginger1 }|end1;']

使用正则表达式来元素方括号内容 -

newlist1 =[re.sub('\[.+?\]','',newlist[0])
Output of newlist2- ['abc||efg|{|egg||ginger }|end;|abc1||efg1|{|egg1||ginger1 }|end1;']

它也消除了大括号内的方括号内容..

Expected output : ['abc||efg|{|egg|[fff]|ginger }|end;|abc1||efg1|{|egg1|[fff1]|ginger1 }|end1;']

标签: python

解决方案


虽然这不是您要求的答案,但我希望它会对您有所帮助。首先我预处​​理文本,然后应用正则表达式。

import re
def preprocess(text):
    CurluBrace=False
    for i in range(len(text)):
        c=text[i]
        if c=='[' and CurluBrace==False:
            text=text[:i]+'`'+text[i+1:]
        if c==']' and CurluBrace==False:
            text=text[:i]+'`'+text[i+1:]
        if c=='{':
            CurluBrace=True
        if c=='}':
            CurluBrace=False
    return text
        


def main():
    text='abc|[apple|banana|cucumber]|efg|{|egg|[fff]|ginger }|end;|abc1|[ |apple1|banana1|cucumber1|]|efg1|{|egg1|[fff1]|ginger1 }|end1;'
    processedText=preprocess(text)
    newlist1 =[re.sub('\`.+?\`','',processedText)]
    print(newlist1)

更优雅的解决方案:

import re
def preprocess(text):
    CurlyBraceContext=0
    for i in range(len(text)):
        c=text[i]
        if CurlyBraceContext<=0:   
            if c=='[' or c==']':
                text=text[:i]+'`'+text[i+1:]
        if c=='{':
            CurlyBraceContext+=1
        if c=='}':
            CurlyBraceContext-=1
    return text
        
def main():
    text='abc|[apple|banana|cucumber]|efg|{|egg|[fff]|ginger }|end;|abc1|[ |apple1|banana1|cucumber1|]|efg1|{|egg1|[fff1]|ginger1 }|end1;'
    processedText=preprocess(text)
    newlist1 =[re.sub('\`.+?\`','',processedText)]
    print(newlist1)

推荐阅读