《Using OpenRefine》翻译~17

上一篇:《Using OpenRefine》翻译~16


第五章:正则表达式和GREL

OpenRefine中有两个很强大的工具: regular expressions(正则表达式) 和 GREL. Regular expressions 是我们在处理大量数据时用来匹配和替换文本的有效工具。General Refine Expression Language, GREL, 是当需要进行数据特别处理时预定于函数。这一章我们将介绍这两个工具。

 

 

对文本应用正则表达式

OpenRefne 提供了很多查找所需数据的方法。但是如果你并不知道确切的文本,或者是大数据集中模糊的要求,又或者是单元格间有微小的差别该怎么办呢?因为单是查找一个字母a是比较简单,但是查找那些包含一个数字(更差的情况是,一个字母后面跟一个数字)的值就困难的多了。这时候正则表达式就该登场了。

正则表达式能够定义一个文本样式,而不需要指定一系列精确的文本集。这可以让你做到指定比如“一个字母后面跟一个数字”及更复杂的东西。正则表达式通过建立一些字符集,这些字符集可以代表你需要查找的内容,与数量符,锚符,可选符组符配合使用就可以满足你的查找需求。

OpenRefne中使用正则表达式十分简单。对任何列进行一次文本过滤(Powerhouse Museum数据集中的Object Title 列就特别有趣),通过点击Object Title 列下拉菜单中的Text filter执行.在新创建的过滤窗口中勾选regular expression (正则表达式)选项。现在数据就可以按照你书写的表达式进行过滤:

字符集

正则表达式使用字符集(字母,数字,空格等)来查找字符。比如,如果你要查找字母或者数字,你可以直接输入:

• 使用Aar来查找,那么就会查找所有文本,其中文本中包含一个大写A后面跟小写的a和r。如果区别大小写选项case sensitive未被勾选,那么查找就不会区别大小写。

• 使用123来查找,那么将查找所有文本,其中包含这些数字。记得41235同样也会被查找到,因为123同样是其的一部分。

• 上面的内容,我们发现就是一般的文本匹配。但是如果使用正则表达式,那么我们就可以指定那个任何的字母或数字。我们可以使用方括号[ ]来指定一系列的待选字符集。我们还可以在方括号内使用 - 来指定字符域范围

• [0123456789]匹配其中任何一个数字。

• [0-9]和上面是一个意思,只不过这个更加紧凑。意思是0-9之间的数字都可以。

• 同样的,[a-z]匹配了所有小写字母(如果区别大小写选项未勾选,则大写字母也会被匹配)。[A-Z]匹配了所有大写字母。[a-zA-Z]匹配了所有字母,无论大小写。

• 如果你想匹配字母和数字,可以使用[0-9a-zA-Z]。代表某个字符,可以是0-9之间的任何数字,可以是a-z之间的任何字母,也可以是A-Z之间的任何字母。

• 早些介绍的例子中,我们可以把所有的可能匹配项放在一起,如analy[sz]e将匹配美式拼写(analyze)和英式拼写(analyse)。

• 同理,[0-9][a-z]代表一个数字后面跟至少一个小写字母。[a-z][0-9][0-9][0-9]代表一个字母后面跟至少三个数字。

• 如果你想匹配到如1 cm 或25 in,那么使用上面的办法将无法匹配到,因为中间有个空格。幸运的是,空格也是一个字符,所以可以使用[0-9]  [a-z] 。记得两个方括号之间有一个空格,并且这个匹配也能匹配到如12345 meters之类的长字符。事实上,其匹配了所有一个数字后面跟一个空格,然后再跟一个字母的样式。12345 meters其实匹配到了5 m。其余数字或者字母其实并没有多大关系。

• 如果你想查找所有以inches为单位的内容,那么可以使用[0-9] in。

• 每次都写[0-9]可能比较麻烦。所以我们可以用到简化字符集。它们是一些代替字符集的符号。比如,\d代表任何数字,其实就是等同于[0-9],书写更加简便。\D代表非数字,可以是字母或者其他字符。不幸的是,没有代表任何字母的简化字符集,但是有一个代表任何字母、数字或下划线的字符集:\w,其代表一个任何字符。相反的是,\W代表一个字符,其不是字母、数字或下划线。

• \d[a-z]代表任何一个数字后面跟一个小写字母。

• \d\d\d代表至少有3个连续数字

• \D\D代表至少有2个连续非数字。如果你看到匹配项中也有数字可能会感到奇怪,其实原因是:其只保证匹配到的项中至少有2个连续非数字,但是并不表示一定不包括数字。当然,如果文本内容中只有数字,那么就不会被匹配到。其实这个表达式代表的意思是:“我在查找至少有2个连续非数字的内容,有吗?”

• 你可能想知道\D如何工作的。是不是其需要查找所有不包含数字的字符。其实答案很简单,其在括号中第一个字符前使用^,代表括号中的字符不得出现,所以\D其实就是[^0-9]。

• [^a-zA-Z0-9] 代表不是字母且不是数字。很多字符会被匹配到,比如连续的空格和标点符号。但是,空值是不会被匹配的,因为这里至少需要一个字符,且这个字符不是字母和数字。

• [^a-zA-Z0-9]\d[^a-zA-Z0-9]代表任何一个数字,且其前后都有一个字符,这个字符不是字母及数字。举个例子,圆括号中单个数字(3)会被匹配到,而如(123)不会。因为这个表达式表示的就是需要单个数字。

如果你确实想匹配任意一个字符,那么可以使用点“.”,这个字符匹配任何字符(除了换行符\n)。当然单个使用并没有多大用处,但是和其他字符集配合使用的话就十分有用了。

• a.a.a将匹配到至少连续出现三次字母a,并且两个a之间有一个任意字符,比如,dulcamara, alabaster, salamander都会被匹配到。

• 19.. (其前后各有一个空格)将匹配到所有20世纪的年份。

• 但是,使用点还是需要慎重:19.. 同样也会匹配19th和19M$。因为点代表任何字符,所以如果你想代表年份的话,19\d\d会更加精确。

现在,你可能想知道如何匹配到一个真实的点、方括号或者真实的反斜杠加字母d。办法是告诉正则表达式你不想使这些字符代表特殊意义。对于字母、数字、空格及一些其他字符,一般不会产生歧义,但是对于有特殊含义的字符,可以在前面再加上反斜杠,点可以表示为\.。反斜杠可以表示为\\。

• 可以使用\.\.\.表示三个连续的点(当然还有更高效的办法,我们将在下节介绍)

• 可以使用\\来匹配反斜杠\。(本数据集中没有这种情况)

• 可以使用[\[\]]来匹配文本包含左方括号[或者右方括号]。这看起来比较复杂,但其实还是很容易理解的:最先的左方括号和最后的右方括号代表“任意此放括号中内容将匹配”。但是此方括号内的内容为真实的左右方括号,所以需要特别指定,使用\[ 和 \]。

• [2]代表匹配数字2(方括号内的任意内容被匹配,这里只有2)。使用\[2\]将匹配真实的2,且前后分别有一个左方括号和右方括号(“[2]”)。因为这次被特别解释了,所以方括号也就失去了其特殊的意义。

 

 

 

 

 

 

数量符

到现在为止,我们介绍了正则表达式中单个字符的表示。但是,我们可能会遇到需要匹配一个未知字符多次的情况。比如,我们如何表示“单引号里面一个数字”,我们可能会使用’\d’,但是这只会包括类似于0,1,5之类的单位数数字,多位数数字如23和478将不会被匹配。因为,计算机解释’\d’就是:一个单引号,一个数字,再一个单引号。

数量符能够用来表示重复。有三种简单的数量符:加号+,代表重复1次及以上;星号*,代表重复0次及以上;问号?,代表重复0次或1次;它们只是针对直接的左侧字符起作用。

• bre+d匹配了bred, breed, 或 breeed等任何数量的e,只要e起码出现1次。

• bre*d匹配了brd,bred, breed, 或 breeed等任何数量的e,可以看到没有e也会被匹配,记住brd会被星号匹配,但是加号则不会被匹配。

• 我们可以组合使用,br?e+d匹配了bed, bred, beed, breed,beeed, breeed等等。

• 另外,你可以使用花括号{最小值,最大值}来表示字符的重复区间。你可以确定重复的最大值和最小值。其中任何一个可以为空,如果没有最小值或者最大值。但是你必须将逗号保留,以保证OpenRefine能知道是最小值还是最大值。如果你仅仅输入一个数字但是没有逗号,那么将仅仅匹配这个数字的重复次数。

• N\d{5,8},将匹配字母N开头,后面跟5位或6位或7位或8位数字,然后是一个逗号。

• N\d{5,},将匹配字母N开头,后面跟5位或5位以上数字,然后是一个逗号。

• N\d{,8},将匹配字母N开头,后面跟最多8位数字,然后是一个逗号。

• N\d{5},将匹配字母N开头,后面跟5位数字,然后是一个逗号。这等同于N\d\d\d\d\d,但是书写更加简洁(特别是数字位数多的情况)。

• 还有一点需要明确,数量符和括号是特殊字符,所以如果你只是想匹配这些字符,那么你就需要在其前面加上反斜杠。比如,将问好?作为字符的话可以输入\?

未完待续... ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值