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

时间:2018-04-24 08:15:31

标签: python regex replace

我想用每个空格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中用 替换每个前导空格的正确方法是什么?

如果没有正则表达式有一个干净的方法可以做到这一点,我很乐意接受,但我自己无法弄明白。

4 个答案:

答案 0 :(得分:2)

你甚至不需要昂贵的正则表达式,只需删除前导空格并为删除的字符数添加一些 个字符:

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

答案 1 :(得分:1)

您可以将re.sub与回调函数一起使用并评估匹配的长度:

>>> raw_line = '  spam eggs'
>>> re.sub(r"^\s+", lambda m: " " * len(m.group()), raw_line)
'  spam eggs'

答案 2 :(得分:1)

使用regex模块(由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变

     

已添加搜索锚点。它匹配在每个的位置   搜索开始/继续,可用于连续匹配或在   负可变长度的lookbehinds限制了多远   lookbehind去了

答案 3 :(得分:0)

regex解决方案:

s = '  spam eggs'
s_s = s.lstrip()
print(' '*(len(s) - len(s_s)) + s_s)
#   spam eggs