2013-04-16 27 views
0

我這個標點符號之前更換空間 - 工作,但是 - 很unelegant代碼:字符串中的字符替換:如何用正則表達式來實現?

my_string = "There , are , many , wrong . spaces , before interpunction marks !" 

my_string.replace(" ,", ",").replace(" .", ".").replace(" !", "!").replace(" ?", "?") 

現在我試着拿出一個更優雅的解決方案,即一個正則表達式。但我得到的是:

import re 
my_string = re.sub(r"[\s]+[,.!?]", XXX, my_string) 

我只是不明白如何讓XXX與相應的mark替換每個whitespace+mark。或如何簡單地去除所有標記之前每個空白 - 這工作太...

回答

2

你想創建一個捕獲組的標點,然後參考該組中的替換式:

re.sub(r'\s+([,.!?])', r'\1', my_string) 

你不需要\s左右括號;它已經是一個角色類。

示範:

>>> import re 
>>> my_string = "There , are , many , wrong . spaces , before interpunction marks !" 
>>> re.sub(r'\s+([,.!?])', r'\1', my_string) 
'There, are, many, wrong. spaces, before interpunction marks!' 
+0

真棒 - 謝謝! – Chrugel

+0

我回到了[docs.python/re](http://docs.python.org/3.2/library/re.html),我明白了爲什麼我自己無法捕捉它......沒有單獨的段落或任何指示'\ 1'重要性的內容。它隱藏在句子的中間,在例子中... – Chrugel

0

添加捕獲組:

[\s]+([,.!?]) 

然後在更換使用它:

\1 

\ n指的是第n個捕獲組,整個匹配爲0。

+0

總是混合它們,謝謝你的通知。 – Loamhoof

1

你需要使用括號來捕捉標點,然後參照其使用\1到:

import re 
my_string = "There , are , many , wrong . spaces , before interpunction marks !" 
my_string = re.sub(r"[\s]+([,.!?])", r"\1", my_string) 
print my_string # There, are, many, wrong. spaces, before interpunction marks! 
0

最後一行應該是這樣的:

my_string = re.sub(r"\s+([,.!?])", r'\1', my_string) 

模式部分中的paranthesises正在創建一個組,然後您參考該組合自\1以來是第一個也是唯一一個組。