Openrefine正则表达式基础
正则表达式在涉及到文本数据的整理方面极其重要,它实际上就是一种字符串的模式,运用正则可以在文本中匹配出符合模式的字符。不同程序语言中正则表达式的写法有所差异,但基本的思想是一致的,就是找出模式,并从文本中将模式匹配出来。需要注意的是:在openrefine中采用的是java语言的正则,由于openrefine的实时预览方式,可以说是学习正则、调试正则最理想的工具。
正则表达式初看起来向天书,比较抽象,感觉很难的样子,但是掌握了学习的方法,学习起来就容易多了。学习正则最好的方法就是多看、多练,首先要弄懂正则的基础知识,多看别人的例子,读懂正则的书写规律,加上不断的练习,人人都可以学好正则。
一、元字符
元字符是正则表达式中的具有特殊意义的字符,在openrefine中常用的元字符以下这些。
. 表示任何字符
\ 转义字符,将元字符转义成字符本身的意义
| 或,(A|B)表示A或者是B
^ 位置标志,表示字符串的起始位置
$ 位置标准,表示字符串的结束位置
[] 列表符,表示可以匹配列表中的任何字符
[^] 与列表符相反,表示匹配除了列表中元素外的任何字符
二、通用字符
除了元字符以往,正则表达式又给我们提供了一些常用的字符形式,让我们使用起来更加方便。
\d 任何数字,相当于[0-9]
\D 任何非数字,相对于[^0-9]
\w 字母、数字和下划线,相当于[a-zA-Z0-9_]
\W 非字母、数字和下划线,相当于 [^a-zA-Z0-9_]
\s 任意空格
\S 任意非空格
\t tab键
\n 换行符
\r 回车符
三、数量单位
有了元字符和通用字符以后,就需要有表示数量的单位与元字符和通用字符配合,来表示字符的个数
? 前面的字符出现0次或1次
* 前面的字符出现0次或任意次
+ 前面的字符至少出现1次或任意次
{n} 前面的字符出现n次
{min,} 前面的字符出现min次或任意次
{min,max} 前面的字符出现min到max区间内次
举例说明:
row1 abc2 RUS
row2 abc1 KAN
row3 abc NTP
\d?#匹配1个或0个数字的模式
value.find(/abc\d?/) #匹配abc后面跟一个数字或者不跟数字的模式
row1 abc22135 RUS
row2 abc112122 KAN
row3 abc11 NTP
\d{3,5}#匹配3个到5个数字的模式
value.find(/abc\d{3,5}/)#匹配abc后面跟3-5个数字的模式
四、分组和引用
在openrefine中,使用的是Java正则,以括号来进行分组,在后面可以使用$符号加数字或\加数字来对前面的分组进行引用,节省我们的时间和精力。
() 分组
$1,$2 or \1,\2 引用
举例说明:
value.replace(/(\w+)\s.*\s(\w+)/,'$1+$2')
#寻找字母和数字组合后面跟一个空格的模式分组1
#寻找最后一个空格后面是字母的模式分组2
#将整个字符串替换成 组1+组2的字符串
#注意:替换部分是字符串,不能是表达式
五、可选模式
m 多行模式
s 单行模式
i 不区分大小写
例子
((?i)t) 匹配 t or T
value.find(/(?i)t/)
此外正则表达式还有零宽断言等其他内容,我们将来再学习,还有要注意的是,在openrefine中,find()、match()等函数匹配的结果都是列表形式,需要通过取值或.join()等方式来获取字符串。