用其他字符替换Python中的前导空格

4
我希望将我的前导空格替换为每个空格一个nbsp;
因此,例如:
spam --> spam
 eggs -->  eggs
  spam eggs -->   spam eggs

我看过一些使用正则表达式的解决方案,但它们都是其他语言编写的。 我尝试在Python中使用以下代码,但没有成功。

import re

raw_line = '  spam eggs'

line = re.subn('\s+', ' ', raw_line, len(raw_line))
print(line) # outputs   spam eggs

line = re.sub('\s+', ' ', raw_line)
print(line) # outputs   spam eggs

line = re.sub('^\s', ' ', raw_line)
print(line) # outputs   spam eggs

line = re.sub('^\s+', ' ', raw_line)
print(line) # outputs  spam eggs

最后一行似乎是最接近的,但仍未成功。

在Python中,用什么正确的方法来将每个前导空格替换为 

如果有一种不需要使用正则表达式的简洁方法,我会很高兴接受,但我自己无法找到。


1
使用 regex PyPi 库,只需一行代码 regex.sub(r'\G\s', ' ', s) 即可完成替换。而使用 re 则需要使用 re.sub(r'^ +', lambda x: x.group().replace(' ', ' '), s) 进行替换。 - Wiktor Stribiżew
1
这里有一个答案:https://dev59.com/s6Xja4cB1Zd3GeqPU6wQ#46555420 - Wiktor Stribiżew
找了一会儿才找到...必须得说它可能回答了直接的问题,但标题命名规范对于搜索并不是很有效,不是吗? - Nebulosar
其实,我花了20秒钟找到它。不知道标题是好还是坏。 - Wiktor Stribiżew
做得好,我找了半个小时都没找到。看来我需要提高我的堆栈搜索技能了。 - Nebulosar
4个回答

5
你甚至不需要使用昂贵的正则表达式,只需移除前导空格并在移除的字符数前添加适量的 字符即可:
def replace_leading(source, char=" "):
    stripped = source.lstrip()
    return char * (len(source) - len(stripped)) + stripped

print(replace_leading("spam"))         # spam
print(replace_leading(" eggs"))        #  eggs
print(replace_leading("  spam eggs"))  #   spam eggs

不错!我尝试了一下不用正则表达式,但是没想出来。采用了你的解决方案,因为我相信如果可以不用正则表达式就不用它!在我看来,不使用正则表达式更易读、易维护,因此默认更符合 Python 的风格。 - Nebulosar

1
你可以使用 re.sub 函数与回调函数,并评估匹配的长度:
>>> raw_line = '  spam eggs'
>>> re.sub(r"^\s+", lambda m: " " * len(m.group()), raw_line)
'  spam eggs'

1

使用正则表达式模块(由Wiktor Stribiżew在评论中回答)

>>> import regex
>>> line = 'spam'
>>> regex.sub(r'\G\s', ' ', line)
'spam'

>>> line = ' eggs'
>>> regex.sub(r'\G\s', ' ', line)
' eggs'

>>> line = '  spam eggs'
>>> regex.sub(r'\G\s', ' ', line)
'  spam eggs'

来自文档:

\G

新增了搜索锚点。它匹配每次搜索开始/继续的位置,并可用于连续匹配或在负变长回顾中使用,以限制回顾的范围。


0
一个非正则表达式的解决方案:
s = '  spam eggs'
s_s = s.lstrip()
print(' '*(len(s) - len(s_s)) + s_s)
#   spam eggs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接