python - Python:用一次替换多次出现的字符,但用无替换一次
问题描述
我有一个字符串:
a = '0202201131181'
我想用一次替换所有多次出现的1
in a
,1
但如果只找到一次出现的“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'
,这是不正确的。这个怎么做?
解决方案
正则表达式可能是最好的选择:
import re
a = '020220111311811001001001001'
a = re.sub(r'1{2,}', '1', re.sub(r'(?<!1)1(?=[^1]|$)', '', a))
print(a)
首先分出单个1
s,然后分出多次出现的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) 不是 a1
,或者 b) 是字符串的结尾。
推荐阅读
- css - 限制 div 的大小以避免溢出,当它包含一个 img
- node.js - Nodejs图像调整大小:pngload不可恢复状态
- python - 如何以最接近的值对时间戳进行排序?
- gcc - 使用 GCC 在 unix 中创建 win32 控制台应用程序
- telerik-mvc - Retrieve Highlighted (Selected) options in Listbox (Telerik UI for Asp.net MVC)
- autodesk-forge - 如何在 Forge Viewer 中使 Revit Room 可点击?
- flutter - CachedNetworkImage 的颤振占位符
- python - 对于新创建的文件,write() 和 append() 方法有什么区别吗?
- python - 无法使用 Python Selenium 选择项目我做错了什么?
- python - 将“美化”JSON读回python