Python:用空格填充标点符号(保留标点符号)

17

有什么有效的方法可以使用空格填充标点符号吗?

输入:

s = 'bla. bla? bla.bla! bla...'

期望的输出:

 s = 'bla . bla ? bla . bla ! bla . . .'

注释:

  1. 我不在乎标记之间有多少个空格。(但它们最终需要被折叠)
  2. 我不想填充所有的标点符号。假设我只关心 .,!?()。

2
“<微小的细节>” 你不觉得最后一个句点后面应该有一个空格吗? - Kobi
3个回答

31

你可以使用正则表达式来匹配你感兴趣的标点符号,并将它们用空格包围起来,然后使用第二步在文档中的任何位置折叠多个空格:

s = 'bla. bla? bla.bla! bla...'
import re
s = re.sub('([.,!?()])', r' \1 ', s)
s = re.sub('\s{2,}', ' ', s)
print(s)

结果:

bla . bla ? bla . bla ! bla . . .

8
如果您使用Python3,可以使用maketrans()函数。
import string   
text = text.translate(str.maketrans({key: " {0} ".format(key) for key in string.punctuation}))

如果标点符号周围已经有空格,那么这个匹配吗? - Maged Saeed
@MagedSaeed 是的 - Lynne

5
如果没有空格,则会添加一个空格,不会破坏现有空格或其他空白字符:
s = re.sub('(?<! )(?=[.,!?()])|(?<=[.,!?()])(?! )', r' ', s)

这是通过在标点符号和非空格字符之间找到零宽度位置,并在那里添加一个空格来实现的。
请注意,它确实在字符串的开头或结尾添加了一个空格,但可以通过将正向查找更改为(?<=[^ ])(?=[^ ])来轻松完成。
在此处查看其效果:http://ideone.com/BRx7w

这是我不重复太多代码的版本(我不知道任何Python):http://ideone.com/PuVz5 - Kobi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接