Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:将charactercate的多次出现替换为一次,但将单个出现替换为无_Python_Python 3.x_String_String Formatting - Fatal编程技术网

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

Python:将charactercate的多次出现替换为一次,但将单个出现替换为无,python,python-3.x,string,string-formatting,Python,Python 3.x,String,String Formatting,我有一个字符串: a = '0202201131181' 我想将a中所有多次出现的1替换为一个1,但如果只找到一个出现的“1”,则将其替换为空字符串“” 我的最终目标是: a = '0202201318' 此处,字符“8”之后的“1”只出现一次,因此它被空字符串替换,但字符“3”之前和字符“3”之后的“11”被替换为“1” 下面是我尝试的if-else代码块,部分正确: if '11' in a: a = a.replace("11","1") else: a = a.rep

我有一个字符串:

a = '0202201131181'
我想将
a
中所有多次出现的
1
替换为一个
1
,但如果只找到一个出现的“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","")

但它输出的是不正确的
'0202013181'
。如何做到这一点?

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

import re

a = '020220111311811001001001001'

a = re.sub(r'1{2,}', '1', re.sub(r'(?<!1)1(?=[^1]|$)', '', a))
print(a)
如果您不喜欢一行造成的混乱:

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

a=re.sub(r'(?这是一种不使用正则表达式实现预期输出的方法。
我正在做的是,将字符串从“11”中拆分出来,并将所有的“1”替换为空白,然后再次将列表合并为字符串,并使用“1”

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))

基于正则表达式的解决方案是最好的。对此没有任何想法

只是另一个逻辑,不使用正则表达式,只是为了记录:

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

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


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

一次可以有两个以上的吗?@TaohidulIslam是的,另一个示例可能是
a='02020111311811'
,在这种情况下,所需的输出将是
a='0202013181'
向上投票。我认为第二个正则表达式应该是
1{1,1}
-简单得多,速度也快得多。另外,我会将这两个替换作为两个连续语句来实现,这会让事情变得更加清晰。@virolino如果它这么简单,那就太好了,不幸的是,这样的模式(可以进一步简化为
1
)将像
11
这样的字符串匹配两次……关于可读性,我只是一行程序的忠实粉丝,我能说什么呢?:)嗯……第一部分你似乎是对的。关于第二部分,我也喜欢不破坏可读性的单行程序,也喜欢不增加不必要的复杂性的单行程序。在这种情况下,它更像是混淆-我的2美分:):))谢谢-两行看起来更好:D@PIG
(?:确保前面的字符不是a
1
1
:逐字匹配a
1
(?=[^1]|$)
:确保前面的字符不是a
1
,或者b)是字符串的结尾。如果连续有两个以上的1,则该操作将无效。a='020201131181111'@PIG它将用'11'替换最后2对。如果OP想要执行递归操作,那么它将需要再进行一次修订以获得最终结果。否则,根据目前的情况,我想这是正确的,因为它给出了“02020131811”作为最终结果。几乎就像正则表达式的气泡排序:)但是如果正则表达式不是一个选项,我们必须处理它,对。@virolino,对。拥有另一种选择并没有坏处。:)
02022013181
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))
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