代码之家  ›  专栏  ›  技术社区  ›  Arkistarvh Kltzuonstev

Python:将charactercate的多次出现替换为一次,但将单个出现替换为无

  •  3
  • Arkistarvh Kltzuonstev  · 技术社区  · 7 年前

    我有一个字符串:

    a = '0202201131181'
    

    1 在里面 a 1.

    我的最终目标是:

    a = '0202201318'
    

    此处,字符“8”之后的“1”只出现一次,因此它被空字符串替换,但字符“3”之前和字符“3”之后的“11”被替换为“1”。

    下面是我尝试的if-else代码块,部分正确:

    if '11' in a:
        a = a.replace("11","1")
    else:
        a = a.replace("1","")
    

    '02022013181' ,这是不正确的。如何做到这一点?

    5 回复  |  直到 7 年前
        1
  •  11
  •   iz_    7 年前

    正则表达式可能是最好的选择:

    import re
    
    a = '020220111311811001001001001'
    
    a = re.sub(r'1{2,}', '1', re.sub(r'(?<!1)1(?=[^1]|$)', '', a))
    print(a)
    

    首支单曲 1 s、 然后细分出多个匹配项 . 我又添加了一些字符 a 用于测试目的,输出为

    0202201318100000000
    

    如果您不喜欢一行造成的混乱:

    a = re.sub(r'(?<!1)1(?=[^1]|$)', '', a)
    a = re.sub(r'1{2,}', '1', a)
    

    解释 (?<!1)1(?=[^1]|$) :

    • (?<!1) 1. .
    • 1. :字面上匹配a 1. .
    • (?=[^1]|$) :确保前面的字符是a)不是a 1. ,或b)是字符串的结尾。
        2
  •  1
  •   Jay    7 年前

    基于Regex的解决方案是最好的。对此没有任何想法。

    a = '110202201111311811'
    new_str = []
    
    for i in range(len(a)):
       if a[i] == '1':
           if (i!= (len(a)-1) and a[i+1] == '1') and (i!=0 and a[i-1] != '1'):
               new_str.append(a[i])
       else:
           new_str.append(a[i])
    
    print ("".join(x for x in new_str))
    

    输出:

    02022013181
    
        3
  •  0
  •   Shivam Pandya    7 年前

    这是一种在不使用正则表达式的情况下实现预期输出的方法。

    a = '0202201131181'
    tmp =[ i.replace('1', '') for i in a.split('11')]
    print(('1').join(tmp))
    

    清单的细目:

    a = '0202201131181'
    tmp =[]
    
    for i in a.split('11'):
      i = i.replace('1','')
      tmp.append(i)
    
    print(('1').join(tmp))
    
        4
  •  0
  •   virolino    7 年前

    非正则表达式解决方案,灵感来自@Jay。我对Python一无所知,所以语法可能需要修改。当然,没有经过测试。“好处”:条件不那么复杂(我希望如此)。

    a = '110202201111311811'
    new_str = []
    
    while (not end of string) :
        while ((a[i]!='1') and (not end of string))
            new_str.append(a[i])
            i++
    
        if (a[i+1] is not out of range ) and (a[i+1] != '1') :
            i++
        else :
            new_str.append(a[i])
            while a[i]=='1' :
                i++
    
    print ("".join(x for x in new_str))
    
        5
  •  0
  •   Ora Aff    7 年前
    a = '111020220113111111'
    while a.find('11') != -1:
      i = 0
      j = 1
      while i < len(a):
        for c in a:
            if a[i] == '1':
                if a[j] == '1':
                    a = a.replace(a[i],'x')
        i = i + 1
        j = i + 1
      a = a.replace("xx","1")
      a = a.replace("x","1")
    print(a)
    

    a = '111020220113111111'          >> 1020220131
    a = '020220111311811001001001001' >> 02022013181001001001001
    a = '0202201131181'               >> 02022013181
    

    注意:编辑了我以前的代码。