python - 将格式化控制字符(退格和回车)应用于字符串,无需递归

标签 python regex backspace control-characters

“解释”字符串中的格式化控制字符的最简单方法是什么,以像打印一样显示结果。为简单起见,我假设字符串中没有换行符。

例如,

>>> sys.stdout.write('foo\br')

显示,因此

interpret('foo\br') 应该是 'for'

>>>sys.sdtout.write('foo\rbar')

显示,因此

interpret('foo\rbar') 应该是 'bar'

<小时/>

我可以在这里编写正则表达式替换,但是,在 '\b' 替换的情况下,必须递归应用它,直到不再出现。如果不使用递归的话会非常复杂。

有没有更简单的方法?

最佳答案

如果效率不重要,一个简单的堆栈就可以很好地工作:

string = "foo\rbar\rbash\rboo\b\bba\br"

res = []
for char in string:
    if char == "\r":
        res.clear()
    elif char == "\b":
        if res: del res[-1]
    else:
        res.append(char)

"".join(res)
#>>> 'bbr'

否则,我认为这与您在复杂情况下所希望的速度一样快:

string = "foo\rbar\rbash\rboo\b\bba\br"

try:
    string = string[string.rindex("\r")+1:]
except ValueError:
    pass

split_iter = iter(string.split("\b"))
res = list(next(split_iter, ''))
for part in split_iter:
    if res: del res[-1]
    res.extend(part)

"".join(res)
#>>> 'bbr'

请注意,我没有对此进行计时。

关于python - 将格式化控制字符(退格和回车)应用于字符串,无需递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25878223/

相关文章:

python - 对 xarray DataArray 插值 N 个点并使用 dask 获取插值的 N 列表

python - Django 无法连接到 SQL Server 2019

python - 发送压缩后的表单数据

python - 对 python3 中\b(退格)后面发生的事情感到困惑

java - 在 Java Swing 中处理退格键

android - Visual Studio 2015 Community RC Cordova 无法删除 contenteditable div 中的图像

python - 高效地逐行构建 Pandas 数据框

php - 如何匹配出现在特定子字符串之后的多个子字符串?

java - 正则表达式 - Java 不工作

java - 正则表达式删除除字符和数字之外的所有内容