1

我有一个长字符串,其中包含 \n、\r、\t 以及单词和其他字符之间的空格的各种组合。

  • 我想将所有多个空间减少到一个空间。
  • 我想将所有 \n、\r、\t 组合减少为单个换行符。
  • 我也想将所有 \n、\r、\t 和空格组合减少为单个换行符。

我尝试''.join(str.split())了各种方法都没有成功。

  • 这里正确的 Pythonic 方式是什么?

  • Python 3.x 的解决方案会有所不同吗?

前任。细绳:

ex_str = u'Word   \n \t \r   \n\n\n word2    word3   \r\r\r\r\nword4\n    word5'

所需的输出 [新换行 = \n]:

new_str = u'Word\nword2 word3\nword4\nword5'
4

5 回答 5

5

在所有空格上使用组合str.splitlines()和拆分str.split()

'\n'.join([' '.join(line.split()) for line in ex_str.splitlines() if line.strip()])

这会分别处理每一行,删除空行,然后将每行的所有空格折叠成单个空格。

如果输入是 Python 3 字符串,则相同的解决方案适用于两个 Python 版本。

演示:

>>> ex_str = u'Word   \n \t \r   \n\n\n word2    word3   \r\r\r\r\nword4\n    word5'
>>> '\n'.join([' '.join(line.split()) for line in ex_str.splitlines() if line.strip(' ')])
u'Word\nword2 word3\nword4\nword5'

要保留制表符,您需要删除和拆分空格并过滤掉空字符串:

'\n'.join([' '.join([s for s in line.split(' ') if s]) for line in ex_str.splitlines() if line.strip()])

演示:

>>> '\n'.join([' '.join([s for s in line.split(' ') if s]) for line in ex_str.splitlines() if line.strip(' ')])
u'Word\n\t\nword2 word3\nword4\nword5'
于 2013-07-23T11:39:42.063 回答
2

使用简单的正则表达式:

import re
new_str = re.sub(r'[^\S\n]+', ' ', re.sub(r'\s*[\n\t\r]\s*', '\n', ex_str))
于 2013-07-23T11:48:14.770 回答
0

另一种使用正则表达式的解决方案,它用空格替换制表符u'word1\t\tword2',或者你真的想在这里添加换行符吗?

import re
new_str = re.sub(r"[\n\ ]{2,}", "\n", re.sub(r"[\t\r\ ]+", " ", ex_str))
于 2013-07-23T16:05:26.147 回答
0

使用正则表达式:

>>> s
u'Word   \n \t \r   \n\n\n word2    word3   \r\r\r\r\nword4\t    word5'
>>> re.sub(r'[\n\r\t ]{2,}| {2,}', lambda x: '\n' if x.group().strip(' ') else ' ', s)
u'Word\nword2 word3\nword4\nword5'
>>> 
于 2013-07-23T11:58:17.987 回答
-1
'\n'.join(str.split())

输出:

u'Word\nword2\nword3\nword4\nword5'
于 2013-07-23T11:42:34.513 回答