4

我有一个可变文本(在 Python 中),其中包含应该打印在文件中的文本,它有很多可变长度,大多数行的开头都有额外的空格。我要做的就是删除这些空格。这是我使用的代码。

text = re.sub(r'(^\s*)',r'',text,re.MULTILINE)

然而,只有第一行的空白被删除。其他一切都保持原样。谁能告诉我我做错了什么?

非常感谢。

4

4 回答 4

4

的第四个参数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
于 2013-10-22T13:53:47.917 回答
2

你可以这样做来避免正则表达式

text = '\n'.join([line.lstrip() for line in text.splitlines()])

这将分成几行,去掉前导空格并再次组合回来。只是一种替代解决方案。我喜欢尽可能避免使用正则表达式。但其他人爱他们。

于 2013-10-22T13:57:33.103 回答
0

为什么不将其写入lstrip您的文件流?

file.write(content.lstrip())

假设你遍历你的文本,一行一行地写下来,它几乎是免费的。

于 2013-10-22T14:07:58.953 回答
0

通过避免正则表达式来提高性能可能不会超过代码可读性,除非您一直在处理大量文本。否则,使用正则表达式可能只会产生更容易理解的代码:

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()))
于 2013-10-22T17:46:44.277 回答