Python - 如何在保留字符和数字之间的空格的同时删除中文字符之间的空格?

时间:2017-06-20 09:56:16

标签: python regex space

真正的问题可能更复杂,但就目前而言,我尝试做的事情更容易一些。我试图删除2个中文/日文字符之间的空格,但同时保持数字和字符之间的空格。以下示例:

text = "今天特别 热,但是我买了 3 个西瓜。"

我想得到的输出是

text = "今天特别热,但是我买了 3 个西瓜。"

我尝试使用Python脚本和正则表达式:

import re
text = re.sub(r'\s(?=[^A-z0-9])','')

然而,结果是

text = '今天特别热,但是我买了 3个西瓜。'

所以我一直在努力思考如何在角色和数字之间保持空间?而且我不想使用在" 3"之间添加空格的方法。和"个"。

我会继续思考它,但如果你有想法,请告诉我......提前谢谢你!

1 个答案:

答案 0 :(得分:4)

我理解您需要删除的空格位于字母之间。

使用

re.sub(r'(?<=[^\W\d_])\s+(?=[^\W\d_])', '', text)

<强>详情:

  • (?<=[^\W\d_]) - 需要在当前位置左侧立即使用Unicode字母的正向背后隐藏
  • \s+ - 1+个空格(如果只有一个空格,则删除+
  • (?=[^\W\d_]) - 一个积极的前瞻,需要在当前位置右侧立即使用Unicode字母。

你不需要re.U标志,因为它默认在Python 3中打开。你需要在Python 2中使用它。

您也可以使用捕获组:

re.sub(r'([^\W\d_])\s+([^\W\d_])', r'\1\2', text)

将非消费型外观变为消费捕获组((...))。替换模式中的\1\2是对捕获组值的反向引用。

查看Python 3 online demo

import re
text = "今天特别 热,但是我买了 3 个西瓜。"
print(re.sub(r'(?<=[^\W\d_])\s+(?=[^\W\d_])', '', text))
// => 今天特别热,但是我买了 3 个西瓜。