2011-01-21 79 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第一个和最后一个建议的交叉点,所以它可以清理多个空格,包括制表符和换行符。