繁体   English   中英

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

[英]re.sub put space between punctuation and word where word starts or ends with punctuation

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

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

如果有一种方法可以在一行中完成,那将是很好的,但如果没有,那么有人可以告诉我这两行的调整是什么?

你可以改成它

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链接中看到的那样。

你可以用

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

请参阅正则表达式演示

细节

  • (?<=(?<![^\\W\\d_])[.,!?()-])(?=[^\\W\\d_]) - [.,!?()-]任何标点符号之间的位置[.,!?()-]设置不会立即以字母( [^\\W\\d_] )和字母开头
  • | - 要么
  • (?<=[^\\W\\d_])(?=[.,!?()-](?![^\\W\\d_])) - 字母与您在[.,!?()-]定义的任何标点符号(?<=[^\\W\\d_])(?=[.,!?()-](?![^\\W\\d_]))之间的位置[.,!?()-]后面没有一封信。

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

注意,如果它们的图案保持固定宽度,则可以使用嵌套的前瞻。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM