我正在尝试在标点符号和单词之间放置一个空格,在该位置单词以标点符号开头或结尾,而不是在标点符号之间。从我发现的结果来看,我能想到的最接近的是:
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
如果有一种方法可以做到这一点,那会很好,但是如果没有,那么有人可以告诉我如何调整这两行吗?
答案 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_]))
-字母和您在[.,!?()-]
中定义的任何标点之间的位置,后跟字母。将匹配项(空字符串)替换为空格(因此,仅在匹配的位置插入了一个空格)。
请注意,只要嵌套图案的样式保持固定宽度,就可以了。