【问题标题】:re.sub put space between punctuation and word where word starts or ends with punctuationre.sub 在标点符号和单词之间放置空格,单词以标点符号开头或结尾
【发布时间】:2018-11-27 20:02:13
【问题描述】:

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

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

在所需的输出中,“world-view”保持为“world-view”

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

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

如果有办法在一行中做到这一点,那就太好了,但如果没有,那么有人可以告诉我如何调整这两行吗?

【问题讨论】:

  • 试试re.sub(r'(?&lt;=(?&lt;![^\W\d_])[.,!?()-])(?=[^\W\d_])|(?&lt;=[^\W\d_])(?=[.,!?()-](?![^\W\d_]))', ' ', s)。见demo
  • 请让我知道该解决方案是否适合您,如果不适合,请在问题中添加更多示例。
  • 是的,这完全有效

标签: python regex python-3.x


【解决方案1】:

你可以改成

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-link 中看到的。

【讨论】:

  • 效果很好 - 额外的空间很好,但正如你所说,wiktor 给出了准确的输出
【解决方案2】:

你可以使用

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

请参阅regex demo

详情

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

匹配项(空字符串)被替换为空格(因此,空格只是插入到匹配的位置)。

请注意,如果它们的模式保持固定宽度,则可以嵌套前瞻。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    相关资源
    最近更新 更多