本节书摘来自华章社区《Clojure数据分析秘笈》一书中的第2章,第2.2节使用正则表达式清洗数据,作者(美)Eric Rochester,更多章节内容可以访问云栖社区“华章社区”公众号查看
2.2 使用正则表达式清洗数据
大概最基本、最普遍的数据清洗方式就是正则表达式了。尽管有时被滥用,但是很多时候正则表达式是完成一项工作最适合的工具。而且,Clojure内置编译正则表达式的语法,因此在Clojure中使用正则表达式也很方便。
本例将编写一个标准化美国电话号码的函数。
2.2.1 准备工作
本方法需要在脚本或REPL中使用clojure.string库。表达式如下:
2.2.3 实现原理
本方法中最复杂的部分是正则表达式,接下来对其详细讲解。
(?x):这是本身并不匹配任何内容的标识符。它允许展开正则表达式,并且它会忽略空格和注释。以这种方式编写正则表达式使它们具有相当好的可读性和可用性,特别是6个月后当你试图回忆它的作用时。
(d{3}):匹配三个数字。
D{0,2}:匹配0~2个非数字字符。这是为了允许在区号和前缀之间存在可选的分隔符。
(d{3}):匹配另外三个数字。
D?:这是一个可选的非数字字符。例如,允许一个破折号。
(d{4}):这是电话号码的最后4位数字。
圆括号中间的内容可以被正则表达式匹配。如果正则表达式的圆括号中没有组(groups),re-find仅返回匹配的字符串。如果有组,将返回一个向量。匹配的整个字符串是向量的第一个元素,正则表达式中组的内容存在于向量后面的元素中。本方法使用返回的组来构建输出。
2.2.4 更多信息
正则表达式很复杂,而且很多书对其做了介绍。这里有更多关于正则表达式的资源:
JavaDocs里关于Pattern类的内容可以在http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html找到。它总结了Java中使用正则表达式的语法。
关于正则表达式的Oracle Java教程可以在http://docs.oracle.com/javase/tutorial/essential/regex/找到。
RegexPlant的在线测试器,参见http://www.regexplanet.com/advanced/java/index.html。但REPL是我通常用来构建或测试正则表达式的工具。
2.2.5 参阅
Jamie Zawinski曾说过:
有一些人,当他们遇到难题的时候,会想“我知道,我将使用正则表达式”。然后他们就会有两个难题。
正则表达式是一个复杂的、愚钝的工具,而且通常需要精心设计。有时它们是合适的工具,但有时不是。2.11节将介绍一个更强大、更好用的工具。