2011-01-21 64 views
2

我正在爲一些自由文本工作,我需要做一些數據清理,我有一個問題(在很多方面,我會問以後我肯定):如何替換某些字符周圍的空白?

我需要更換以下組合:

[ ; ](標點前後的空格)

[;](無空格標點前後)

[ ;](僅適用於空間標點符號之前)

[; ](標點符號後才空間)

...其中的標點符號可以是[;:,.]之一。我怎樣才能用正則表達式來做到這一點?

+0

什麼是編程語言或工具?你試過什麼了? – tchrist 2011-01-21 03:53:02

+0

看起來你正在清理句子標點符號。如果這是真的,你不應該匹配`!`(感嘆號)嗎? – 2011-01-21 09:27:28

回答

6

一個可能的表達應該是:

\s?([;:,.])\s? 

並根據編程語言或工具,你正在使用,你必須使用$1\\1\1的反向引用和更換將如$11之後有空格)。

說明:

\s?  - match at most one whitespace character 
(...) - capture group, storing the matched characters in a reference 
    [...] - character class, matching one of the characters inside 

參考文獻:character classcapture groupquantifier

但同樣:表達式可以不同,這取決於你所使用的工具/語言。例如。類似的表述爲sed會是什麼樣子:

/ *\([;:,.]\) */\1/

而且這也將微調的空間周圍的標點符號(有可能是一個更好的辦法,但我不那麼熟悉sed)。

+0

+1,但我認爲@盧卡斯是對的;你應該使用`\ s *`,而不是`\ s?` – 2011-01-21 09:33:08

0

這取決於你使用什麼語言如何將其移動到已清洗的形式,[; ],但您可以通過內附他們[],像[;:,.]匹配任何標點符號。

一旦你完成了你的模式,你可以用你乾淨的版本替換匹配。至少在Java中,你可以用類似"\[$<GroupNumber> \]"的東西來代替它,<GroupNumber>根據組的順序引用帶有標點符號的圓括號組,例如1,2,3等。

請記住,根據您使用的語言,您可能需要避開反斜槓。如果您使用的是Java,那麼對於上述所有示例,您需要使用\\來代替\

+2

在大多數情況下(我認爲所有的)口味,這個點不需要在字符類中轉義。在字符類中,只有`^`開頭和`--`開頭或結尾都是特殊的。 – 2011-01-21 04:00:22

2

我會用\s*([;:,.])\s*並用'$1 '替換(加單引號以強調反向引用後的空格。這是Felix第一個和最後一個建議的交叉點,所以它可以清理多個空格,包括製表符和換行符。