簡體   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