使用正则表达式

基于研究需要,我们可能要从公开网页或需要认证的数据库中下载数据。这些数据源
提供的数据格式多种多样,而且大多数数据都被规范地整理在一起。例如,许多经济、金
融数据库提供 CSV 格式的数据,这是一种支持非常广泛、用于表示表格数据的文本格式。
一个典型的 CSV 格式看起来如下:
id,name,score
1,A,20
2,B,30
3,C,25
在 R 中,由于 CSV 文件的格式就是数据框的一种表示形式,我们可以方便地通过
read.csv( ),以正确的表头和数据类型将 CSV 文件导入为数据框。
然而并不是所有的数据都组织有序,处理格式混乱的数据是十分费力的。尽管在许多
情况下,内置的 read.table( )和 read.csv( )都适用,但是它们对于缺乏统一格式
的数据也无能为力。
例如,假设原始数据(messages.txt)的组织形式和 CSV 格式类似,那么,当使用
read.csv( )的时候,需要谨慎一些:
2014-02-01,09:20:25,James,Ken,Hey, Ken!
2014-02-01,09:20:29,Ken,James,Hey, how are you?
2014-02-01,09:20:41,James,Ken, I'm ok, what about you?
2014-02-01,09:21:03,Ken,James,I'm feeling excited!
2014-02-01,09:21:26,James,Ken,What happens?
实际上,想要导入为数据框的文件,是像下面这样被组织好的格式:
Date Time Sender Receiver Message
1 2014-02-01 09:20:25 James Ken Hey, Ken!
2 2014-02-01 09:20:29 Ken James Hey, how are you?
3 2014-02-01 09:20:41 James Ken I'm ok, what about you?
4 2014-02-01 09:21:03 Ken James I'm feeling excited!
5 2014-02-01 09:21:26 James Ken What happens?
然而,如果盲目地使用 read.csv( ),就会发现它无法正确地工作。这个数据集的
列所包含的信息有一些特殊,其中存在一些在 CSV 文件中会被误认为是分隔符的额外标

点。下面是从原始数据转换成数据框的结果:
read.csv("data/messages.txt", header = FALSE)
## V1V2V3V4V5V6
## 1 2014-02-01 09:20:25 James Ken Hey Ken!
## 2 2014-02-01 09:20:29 Ken James Hey how are you?
## 3 2014-02-01 09:20:41 James Ken I'm ok what about you?
## 4 2014-02-01 09:21:03 Ken James I'm feeling excited!
## 5 2014-02-01 09:21:26 James Ken What happens?
有许多方法可以解决这个问题。可以考虑对每一行使用 strsplit( ),人工去掉最
开始的几个元素,然后把分割开的剩下的行连接起来。但是最为简单且稳定的方法是使用
正则表达式(https://en.wikipedia.org/wiki/Regular_expression)。如果不熟悉这个技术也不必
担心。其使用方法非常简单:描述匹配对应文本的模式,然后从文本中提取想要的部分。
在使用这项技术前,我们需要一些基础知识。激励自己学习的最佳方式是先关注一些
简单的问题,然后考虑解决这个问题需要什么。
假设我们正在处理如下文本(fruits.txt),这个文本描述了一些水果的数量和状态:
apple: 20
orange: missing
banana: 30
pear: sent to Jerry
watermelon: 2
blueberry: 12
strawberry: sent to James
我们不管状态信息,只想提取出所有包含数量信息的水果。尽管可以轻松地一眼看出
结果,但是这对计算机并不容易。如果数据的行数超过了 2000 行,那么通过合适的技术,
计算机可以轻松地解决它。相反,对人类来说,就比较困难、耗时,而且很容易出错。
首先我们需要区分开带有数量的水果和不带有数量的水果。一般来说,需要根据一个
特定的模式来区分文本。在这里,正则表达式就是最合适的技术。
正则表达式通过以下两步解决问题:首先寻找匹配文本的一个模式,然后根据需要对
模式进行分组并提取信息。

寻找字符串模式

使用分组提取数据

以自定义的方式读取数据

posted @ 2019-01-22 14:07  NAVYSUMMER  阅读(96)  评论(0编辑  收藏  举报
交流群 编程书籍