首页 > 解决方案 > Python:用一次替换多次出现的字符,但用无替换一次

问题描述

我有一个字符串:

a = '0202201131181'

我想用一次替换所有多次出现的1in a1但如果只找到一次出现的“1”,则用空字符串“”替换它。

我的最终目标是获得:

a = '0202201318'

这里字符'8'之后的'1'只出现一次,所以它被空字符串替换,但是字符'3'之前的'11'和字符之后的'3'被替换为'1'。

这是我尝试过的 if-else 代码块,它部分正确:

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

但它输出'02022013181',这是不正确的。这个怎么做?

标签: pythonpython-3.xstringstring-formatting

解决方案


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

import re

a = '020220111311811001001001001'

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

首先分出单个1s,然后分出多次出现的1. 为了测试目的,我添加了更多字符a,输出为

0202201318100000000

如果您不喜欢单线造成的混乱:

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

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

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

推荐阅读