匹配相同数量的重复字符作为捕获组的重复

Lou*_*s M 5 python regex backreference

我想清理一些使用python和regex从键盘记录的输入.特别是当使用退格键来修复错误时.

例1:

[in]:  'Helloo<BckSp> world'
[out]: 'Hello world'
Run Code Online (Sandbox Code Playgroud)

这可以通过以下方式完成

re.sub(r'.<BckSp>', '', 'Helloo<BckSp> world')
Run Code Online (Sandbox Code Playgroud)

示例2:
但是当我有几个退格键时,我不知道如何删除完全相同数量的字符:

[in]:  'Helllo<BckSp><BckSp>o world'
[out]: 'Hello world'
Run Code Online (Sandbox Code Playgroud)

(这里我想在两个退格之前删除'l'和'o').

我可以简单地使用re.sub(r'[^>]<BckSp>', '', line)几次,直到没有<BckSp>剩下但我想找到一个更优雅/更快的解决方案.

有谁知道如何做到这一点 ?

Wik*_*żew 1

由于 Python 不支持递归/子例程调用,也没有原子组/所有格量词re,因此您可以在循环中删除这些带有退格键的字符:

import re
s = "Helllo\b\bo world"
r = re.compile("^\b+|[^\b]\b")
while r.search(s): 
    s = r.sub("", s)
print(s)
Run Code Online (Sandbox Code Playgroud)

查看Python 演示

"^\b+|[^\b]\b"模式将在字符串开头(以^\b+)查找 1 个以上退格字符,并将[^\b]\b查找除退格后跟退格之外的任何字符的所有非重叠出现。

如果退格键被表示为某些实体/标签(如文字),则采用相同的方法<BckSp>

import re
s = "Helllo<BckSp><BckSp>o world"
r = re.compile("^(?:<BckSp>)+|.<BckSp>", flags=re.S)
while r.search(s): 
    s = r.sub("", s)
print(s)
Run Code Online (Sandbox Code Playgroud)

查看另一个 Python 演示

  • OP 已经考虑了循环并正在寻找更好的解决方案。 (2认同)