我想用每个空格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中用
替换每个前导空格的正确方法是什么?
如果没有正则表达式有一个干净的方法可以做到这一点,我很乐意接受,但我自己无法弄明白。
答案 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