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>剩下但我想找到一个更优雅/更快的解决方案.
有谁知道如何做到这一点 ?
由于 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)
该"^\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)