我正在爲一些自由文本工作,我需要做一些數據清理,我有一個問題(在很多方面,我會問以後我肯定):如何替換某些字符周圍的空白?
我需要更換以下組合:
[ ; ]
(標點前後的空格)
[;]
(無空格標點前後)
[ ;]
(僅適用於空間標點符號之前)
到
[; ]
(標點符號後才空間)
...其中的標點符號可以是[;:,.]
之一。我怎樣才能用正則表達式來做到這一點?
我正在爲一些自由文本工作,我需要做一些數據清理,我有一個問題(在很多方面,我會問以後我肯定):如何替換某些字符周圍的空白?
我需要更換以下組合:
[ ; ]
(標點前後的空格)
[;]
(無空格標點前後)
[ ;]
(僅適用於空間標點符號之前)
到
[; ]
(標點符號後才空間)
...其中的標點符號可以是[;:,.]
之一。我怎樣才能用正則表達式來做到這一點?
一個可能的表達應該是:
\s?([;:,.])\s?
並根據編程語言或工具,你正在使用,你必須使用$1
,\\1
或\1
的反向引用和更換將如$1
(1
之後有空格)。
說明:
\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 class,capture group,quantifier
但同樣:表達式可以不同,這取決於你所使用的工具/語言。例如。類似的表述爲sed
會是什麼樣子:
/ *\([;:,.]\) */\1/
而且這也將微調的空間周圍的標點符號(有可能是一個更好的辦法,但我不那麼熟悉sed
)。
+1,但我認爲@盧卡斯是對的;你應該使用`\ s *`,而不是`\ s?` – 2011-01-21 09:33:08
這取決於你使用什麼語言如何將其移動到已清洗的形式,[; ]
,但您可以通過內附他們[]
,像[;:,.]
匹配任何標點符號。
一旦你完成了你的模式,你可以用你乾淨的版本替換匹配。至少在Java中,你可以用類似"\[$<GroupNumber> \]"
的東西來代替它,<GroupNumber>
根據組的順序引用帶有標點符號的圓括號組,例如1,2,3等。
請記住,根據您使用的語言,您可能需要避開反斜槓。如果您使用的是Java,那麼對於上述所有示例,您需要使用\\
來代替\
。
在大多數情況下(我認爲所有的)口味,這個點不需要在字符類中轉義。在字符類中,只有`^`開頭和`--`開頭或結尾都是特殊的。 – 2011-01-21 04:00:22
我會用\s*([;:,.])\s*
並用'$1 '
替換(加單引號以強調反向引用後的空格。這是Felix第一個和最後一個建議的交叉點,所以它可以清理多個空格,包括製表符和換行符。
什麼是編程語言或工具?你試過什麼了? – tchrist 2011-01-21 03:53:02
看起來你正在清理句子標點符號。如果這是真的,你不應該匹配`!`(感嘆號)嗎? – 2011-01-21 09:27:28