在标点符号和单词之间重新放置空格,其中单词以标点符号开头或结尾

时间:2018-11-27 20:02:13

标签: 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 77e!  -  -world-view- world-view'))

我得到的输出是:

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

哪一个很近,但我想要:

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

在所需的输出中,“世界视图”保持为“世界视图”

我计划在字符串上同时使用两行代码,所以最终我会得到类似的东西:

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

如果有一种方法可以做到这一点,那会很好,但是如果没有,那么有人可以告诉我如何调整这两行吗?

2 个答案:

答案 0 :(得分:2)

您可以将其更改为

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')) )

输出:

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

它实际上是在任何!?.-周围放置空格,然后再次从\w - \w中删除它们。

在现有' - '周围会有一些额外的空间,不确定是否破坏交易。


@WiktorStribizew的解决方案比较优越,我建议采用他的解决方案-它完全符合您的要求-就我在他的regex101链接中看到的一样。

答案 1 :(得分:1)

您可以使用

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

请参见regex demo

详细信息

  • (?<=(?<![^\W\d_])[.,!?()-])(?=[^\W\d_])-[.,!?()-]集中任何标点符号之间的位置,这些标点符号前没有字母([^\W\d_])和字母
  • |-或
  • (?<=[^\W\d_])(?=[.,!?()-](?![^\W\d_]))-字母和您在[.,!?()-]中定义的任何标点之间的位置,后跟字母。

将匹配项(空字符串)替换为空格(因此,仅在匹配的位置插入了一个空格)。

请注意,只要嵌套图案的样式保持固定宽度,就可以了。