我有一个可变文本(在 Python 中),其中包含应该打印在文件中的文本,它有很多可变长度,大多数行的开头都有额外的空格。我要做的就是删除这些空格。这是我使用的代码。
text = re.sub(r'(^\s*)',r'',text,re.MULTILINE)
然而,只有第一行的空白被删除。其他一切都保持原样。谁能告诉我我做错了什么?
非常感谢。
的第四个参数re.sub
是replace count,不是flag。
re.sub(模式,repl,字符串,count=0,flags=0)
>>> re.MULTILINE
8
>>> print re.sub(r'(^\s*)', '', ' a\n b\n', re.MULTILINE)
a
b
使用关键字参数flags
。
>>> print re.sub(r'(^\s*)', '', ' a\n b\n', flags=re.MULTILINE)
a
b
顺便说一句,你不需要括号:
>>> print re.sub(r'^\s*', '', ' a\n b\n', flags=re.MULTILINE)
a
b
使用str.lstrip
,您不需要正则表达式。
>>> print '\n'.join(map(str.lstrip, ' a\n b\n'.splitlines()))
a
b
你可以这样做来避免正则表达式
text = '\n'.join([line.lstrip() for line in text.splitlines()])
这将分成几行,去掉前导空格并再次组合回来。只是一种替代解决方案。我喜欢尽可能避免使用正则表达式。但其他人爱他们。
通过避免正则表达式来提高性能可能不会超过代码可读性,除非您一直在处理大量文本。否则,使用正则表达式可能只会产生更容易理解的代码:
sample_text = " lorem ipsum\n" * 10
beginning_whitespace = re.compile(r'^\s+', flags=re.MULTILINE)
new_text = re.sub(beginning_whitespace, '', sample_text)
除了有点神秘的其他选项:
new_text = '\n'.join([line.lstrip() for line in sample_text.split('\n')])
new_text = '\n'.join(map(str.lstrip, sample_text.splitlines()))