两个正则表达式合并_孰能生巧Openrefine正则表达式提取信息

 正则表达式是文本处理中的利器,需要不断练习才能熟练掌握,在掌握了语法的基础上还需灵活运用,本文通过具体例子讲解如何在openrefine中运用正则表达式来提取信息。

d38117a31ec03e46831ad8cdd3c2f759.png

1.网页中的数据介绍

在网页中有F1分站赛的处罚信息,这些信息以条目的形式出现,我们的目的是:在openrefine中,将这些条目数据利用正则表达式提取出来,生成结构化表格,以便于后期的分析。

73795d885d7222d7d420eb438a98eeee.png

2.新建refine项目,选择剪切板的方式,将数据粘贴过来

980b42776135fad75e0426bb98dd6350.png

3.去掉空白行

59aefd6a1520dbcc20d743943fe30878.png

efb35aedf475359a1fd2c83c9850687b.png

4.数据清洗

4.1生成包含比赛名称的列

if(value.contains('Prix'),value,"")
#根据Column1列新建一列 命名为race列
#contains(value,"Prix")返回的是TRUE or False,如果字符串中包含Prix字符,返回True,race列取值为value,否则取值为空字符串
#选race列,向下填充,将空格填充满

eee0388b99a35067eae4a70ed97a977c.png

0dc0d8a55a874bce6c0aef86d29b1e9d.png

4.2 生成处罚通知的列

if(contains(value,'Prix'),'',value)

2405bd91a9cb962cc584a91441ef15a3.png

检查数据发现在56-59行出现了归类错误,主要原因是在处罚信息里包含了完整的比赛名称,由于量不是很大,可以直接用edit进行编辑。

编辑前:

f45d001c3b830468d89e2de81114c5cd.png

编辑后:

a707d8b4e198429639df7bc9049325b4.png

4.3去除同一条数据跨多行的情况

检查发现,在penalty notice列中存在着一条数据分布在多行的情况,要将这种情况去除

75a0f6a975921d779df904249b688cdd.png

image-20201023140111965.png

解决方法:

85af17a36099f17531b78daf5c830f56.png

输入正则表达式:^[^-] 
#含义是:匹配开头不是"-"的值,记住行号并用edit对单元格进行剪切-复制更改

507752b401afacf5532105c39405feb2.png

penalty notice列,选择空白行,删除行

9a3abed996f881353916108cb4c95e25.png

ddaae87f72301a7662cd0b5c75ad1f85.png

4.4 提取车手和车队名称

基于penalty notice列,新建列

735981734b377a6f904ba038704ad693.png

使用Java正则语法:
value.match(/- (.*?)\s\(([\w ]+)\)?.*/).join('::')
注意:
1.'-'后面的空格
2.用'?'将贪婪模式改为非贪婪模式
3.\( \)转义为普通括号
4.()代表分组,返回括号内的值,本例中是两个字符串
5.match()匹配字符串,并返回括号中的值
# 使用python正则语法:
#import re
#return re.findall("- (.*)\s\((\w+)\)",value)
#import re
#text=re.search("- (.*)\s\((\w+)\)",value)
#return text.group(1)+'::'+text.group(2)

cf85e6e4aa4797afb9950286552a0424.png

对车手车队列进行分面,检查提取的结果,发现有的行没有提取到信息,原因是没有 车手(车队)这种模式的字符串,手动更改单元格,删除Protest re Pirelli test行

814565f2131fbd93022d6633143f1a36.png

c7ec2a6599ba826f9e5a593bbaae4c05.png

6c94a26be9542c355e26e343d9e108bb.png

4.5将车手车队列分成车手、车队两列(::分割)

8dffcf1bc6511637c4b57130fe648bb8.png

4.6提取罚金

value.replace(',','').match(/.*€(\d+)/)[0]
#先将2,800中的','去掉再匹配正则

ede4f17abed43de6a6b5f8f9c11ed2ad.png

分面检查发现有的罚金没有提取出来(Java正则提取不出来,原因未知,后改用python正则),接下来再提取一次,选择罚金列中空的行,根据penalty notice 新建一列罚金2

value.replace('€',':').replace(',','')

5b50a5bd2fa20029569e25c2728415a8.png

选择罚金2,新建一列罚金1,使用python正则表达式

import re 
return re.findall(".*:(\d+)",value)[0]

056aecbdcc1647bd58ad2c4be1e68318.png

合并罚金列和罚金1列

69d3a0d4bf7b4f94730108b6c4283076.png

4c8454ad60bed1e503ece10146521acf.png

4.7提取比赛阶段

比赛阶段主要有FP...或者Q...或者qualifying

value.match(/(?i).*((FP\d+)|(Q\d+)|(qualifying)).*/)[0]
#(?i)表示整体不区分大小写

24b29fe0aa404859009e39e3b6a0e14a.png

4.8提取速度

value.match(/.*?(\d+\.?\d+)\skm\/h.*/)[0]

d0dc76910f08810232f8287d564146ce.png

已标记关键词 清除标记
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页