Python 在标点符号和单词之间留出空格,单词以标点符号开头或结尾

Python 在标点符号和单词之间留出空格,单词以标点符号开头或结尾,python,regex,python-3.x,Python,Regex,Python 3.x,我试图在标点符号和单词之间留出一个空格,在单词以标点符号开头或结尾的地方,而不是在标点符号之间。根据我的发现,我能想到的最接近的是: print(re.sub(r'([.,!?()\-])([^\s]+)', r'\g<1> \g<2>', '!hello 77e! - -world-view- world-view')) print(re.sub(r'([^\s]+)([.,!?()\-])', r'\g<1> \g<2>', '!hello

我试图在标点符号和单词之间留出一个空格,在单词以标点符号开头或结尾的地方,而不是在标点符号之间。根据我的发现,我能想到的最接近的是:

print(re.sub(r'([.,!?()\-])([^\s]+)', r'\g<1> \g<2>', '!hello 77e!  -  -world-view- world-view'))
print(re.sub(r'([^\s]+)([.,!?()\-])', r'\g<1> \g<2>', '!hello 77e!  -  -world-view- world-view'))
很接近,但我想:

! hello 77e!  -  - world-view- world-view
!hello 77e !  -  -world-view - world-view
在所需输出中,“世界视图”保持为“世界视图”

我计划在字符串上同时使用两行代码,因此到最后我会得到如下结果:

! hello 77e !  -  - world-view - world-view

如果有一种方法可以在一行中实现这一点,那就太好了,但如果没有,那么有人能告诉我如何调整这两行吗?

您可以将其更改为

import re
print(re.sub(r'(\w) - (\w)', r'\g<1>-\g<2>', 
             re.sub(r'([!?.-])', r' \g<1> ', '!hello 77e!  -  -world-view- world-view')) )
它本质上是在任何
!?”周围放置空格-\w-\w
中删除它们

您在现有的
'-'
周围获得了一些额外的空格,不确定这是否是交易的破坏者


@WiktorStribizuw的解决方案非常好,我建议您选择他的解决方案——它完全符合您的要求——正如我在他的regex101链接中所看到的那样。

您可以使用

s = re.sub(r'(?<=(?<![^\W\d_])[.,!?()-])(?=[^\W\d_])|(?<=[^\W\d_])(?=[.,!?()-](?![^\W\d_]))', ' ', s)

s=re.sub(r')(?尝试
re.sub(r')(?请让我知道该解决方案是否适用于您,如果不适用,请为问题添加更多示例。是的,这确实有效-额外的空间很好,但正如您所说,wiktor’s给出了确切的输出
! hello 77e !    -    - world-view -  world-view
s = re.sub(r'(?<=(?<![^\W\d_])[.,!?()-])(?=[^\W\d_])|(?<=[^\W\d_])(?=[.,!?()-](?![^\W\d_]))', ' ', s)