代码之家  ›  专栏  ›  技术社区  ›  Moksh Gaur

替换<…>子字符串

  •  -4
  • Moksh Gaur  · 技术社区  · 6 年前

    提前谢谢。 我想用其他字符替换特定字符串中的空格,如' _ '或' ~ '或者只删除空格,但只针对某些字符之间的子字符串,如' < > '或' " " '. 如。

    config snmp trapreceiver create < community name > < trap receiver IP >
    

    应成为:

    config snmp trapreceiver create < community_name > < trap_receiver_IP >
    

    任何帮助都将不胜感激。

    4 回复  |  直到 6 年前
        1
  •  0
  •   Rakesh    6 年前

    使用Regex:

    import re
    s = """config snmp trapreceiver create < community name > < trap receiver IP >"""
    print(re.sub('\<.*?\>', lambda x: '_'.join(x.group(0).replace("< ", "<").replace(" >", ">").split()), s))
    

    输出:

    config snmp trapreceiver create <community_name> <trap_receiver_IP>
    
        2
  •  0
  •   Aaditya Ura    6 年前

    如果您想尝试不使用regex,那么下面是纯python方法:

    data="""config snmp trapreceiver create < community name > < trap receiver IP > sql things also comes in because < sammm name >"""
    
    splitted_data=data.split()
    
    chunks=[]
    
    def _approach(list_):
        flag=True
        store=[]
        track=[]
        previous=[]
        for i,j in enumerate(list_):
            if j=='<':
                if previous:
                    chunks.append(previous)
                previous=[]
                track.append(i)
                flag=False
    
                store.append(j)
            elif j=='>':
                store.append('>')
                chunks.append(store)
                track=[]
                flag=True
                store=[]
            elif flag==False:
                    store.append(j)
            else:
                previous.append(j)
    
    
    
    
    
    _approach(splitted_data)
    
    
    new_final=[]
    
    for j,i in enumerate(chunks):
        if i[0]=='<':
            new_final.append(i[0]+"_".join(i[1:-1])+i[-1])
        else:
            for ia in i:
                new_final.append(ia)
    
    print(*new_final)
    

    输出:

    config snmp trapreceiver create <community_name> <trap_receiver_IP> sql things also comes in because <sammm_name>
    
        3
  •  0
  •   moonwalker7    6 年前

    有一种更简单的方法来完成此任务(如果您不熟悉regex以及如何在Python中使用lambda)

    Python有一组丰富的内置字符串函数,可以帮助您处理字符串,请看 this 这将帮助您开始。

    回答您的问题:

    这是我的代码:

    a = 'community name'
    b = 'trap_receiver_IP'
    
    c = 'config snmp trapreceiver create < community name > < trap receiver IP >'
    s = c.find( "<" )
    
    def replaceSpace( stringToBeReplaced ):
        aa = stringToBeReplaced.replace( " ", "_" )
        print( aa )
        return aa
    
    def replaceDash( stringToBeReplaced ):
        bb = stringToBeReplaced.replace( "_", " " )
        print( bb )
        return bb
    
    def getSubstring( stringToBeProcessed, stringResult = None ):
    
    
        string = stringToBeProcessed
        resultlst = []
        for i in range(0, 2):
            start = string.find( "<" )
            end = string.find( ">" )
    
            result = string[ start+2 :end-1 ]
            resultlst.append( result )
            string = stringToBeProcessed[end+1:]
    
        return resultlst 
    
    subStringLst = getSubstring('config snmp trapreceiver create < community name > < trap receiver IP >' )
    
    subStringLst[0] = replaceSpace( subStringLst[0] )
    subStringLst[1] = replaceDash( subStringLst [1] )
    
    finalStr = c[:s] + "<" + subStringLst[0] + ">" + " <" + subStringLst[1] + ">"
    print( finalStr )
    
        4
  •  0
  •   Thm Lee    6 年前

    对于要替换的匹配空间,这似乎是可行的

    (?<!\<)(\s+)(?=(?!\>)[^\<\>\n]*\>)
    

    Demo ,,其中仅匹配并捕获要替换的空间

    在python脚本中,可能是这样的

    ss="""config snmp trapreceiver create < community name > < trap receiver IP >
    config snmp trapreceiver create < community name > < trap receiver IP >"""
    
    import re
    regx= re.compile(r'(?<!\<)(\s+)(?=(?!\>)[^\<\>\n]*\>)')
    print(regx.sub("_",ss))
    

    输出为

    config snmp trapreceiver create < community_name > < trap_receiver_IP >
    config snmp trapreceiver create < community_name > < trap_receiver_IP >