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(?:确保前面的字符不是a1
1
:逐字匹配a1
(?=[^1]|$)
:确保前面的字符不是a1
,或者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