regex 如何将所有出现的“00000”重复替换为“0”?

rkue9o1l  于 2022-11-18  发布在  其他
关注(0)|答案(3)|浏览(347)

我需要在一个二进制字符串输入中重复地将所有00000替换为0
虽然我在某种程度上能够做到,但我不知道当有多个连续的00000时的逻辑,如**,例如**:

  • 25个0应替换为1个0
  • 50个0应替换为两个0
  • 125个0应替换为1个0

目前我有以下代码:

new_list = []
c = 0
l = list(s.split("00000"))
print(l)
for i in l:
    if i == "00000":
        for x in range(l.index(i),l.index(i-3)):
            if l[x] != 0:
                break
        for y in range(0,5):
            del l[i-y]
    new_list.append(i)
    new_list.append("0")
r_list = new_list[0:-1]
r_list= ''.join(map(str, r_list))
print(r_list)

但是这对25个0不起作用。另外,正则表达式的替代方案是什么?

bkkx9g8r

bkkx9g8r1#

为了得到这些结果,你需要 * 重复 * 将五个连续的零替换为一个零,直到不再出现五个连续的零。

s = "0" * 125  # example input
while "00000" in s:
    s = s.replace("00000", "0")
print(s)
yizd12fk

yizd12fk2#

正如我在评论中所说的,我最好的猜测是,你试图重复应用5个0被1替换的规则,这样,例如,25个0被简化为00000,而00000又被简化为0。假设这是正确的:
这不是最有效的方法,但有一种方法可以做到:

import re

new = "00000100002000003000000004" + "0"*50
old = ""

while old != new:
    old,new = new,re.sub("0{5}","0",new)
print(new)                              #0100002030000400

或者,这里有一个方法可以在数组中一次应用该更改:

s = "00000100002000003000000004" + "0"*50

stack,ct = ['#'],[-1]
i = 0
while i < len(s):
    if s[i] == stack[-1]:
        ct[-1] += 1
        i+=1
    elif ct[-1] >= 5:
        q,r = divmod(ct[-1],5)
        ct[-1] = q+r
    else:
        stack.append(s[i])
        ct.append(1)
        i+=1
while ct[-1] >= 5:
    q,r = divmod(ct[-1],5)
    ct[-1] = q+r

ans = "".join(c*k for c,k in zip(stack[1:],ct[1:]))
print(ans)
6rqinv9w

6rqinv9w3#

PyPI regex支援recursion。类似以下的程式码可以执行:

import regex as re

s = re.sub(r"0000(?:(?0)|0)", "0", s)

请参见www.example.com上的Python演示tio.run或regex demo at regex101
(?0)(?R)处,模式被粘贴(递归)。

相关问题