我正在为一些自由文本工作,我需要做一些数据清理,我有一个问题(在很多方面,我会问以后我肯定):如何替换某些字符周围的空白?
我需要更换以下组合:
[ ; ]
(标点前后的空格)
[;]
(无空格标点前后)
[ ;]
(仅适用于空间标点符号之前)
到
[; ]
(标点符号后才空间)
...其中的标点符号可以是[;:,.]
之一。我怎样才能用正则表达式来做到这一点?
我正在为一些自由文本工作,我需要做一些数据清理,我有一个问题(在很多方面,我会问以后我肯定):如何替换某些字符周围的空白?
我需要更换以下组合:
[ ; ]
(标点前后的空格)
[;]
(无空格标点前后)
[ ;]
(仅适用于空间标点符号之前)
到
[; ]
(标点符号后才空间)
...其中的标点符号可以是[;:,.]
之一。我怎样才能用正则表达式来做到这一点?
一个可能的表达应该是:
\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