正则表达式-简介与基本语法

未匹配的标注

正则表达式

简介

在前面的案例中,我们已经完成了将网页的内容进行爬取,并且进行保存。但是,我们并没有对获取的网页数据内容进行筛选,而直接全部保到文件中了。

那如何对爬取到的网页内容进行筛选提取呢?之前学过的string包中的一些字符串操作函数可以完成这类任务,如:搜索(Contains、Index)、替换(Replace)和解析(Split、Join),但是处理网页数据实现起来相对而言复杂度较高。实际在工作中,对于这类字符串拆分提取操作,我们通常使用正则表达式来实现。通过正则表达式提取网页内容要方便许多。

当然如果strings包提供的函数能解决你的问题,那么就尽量使用它来解决。因为他们足够简单、而且性能和可读性都要比正则好。

正则表达式是一种进行模式匹配和文本操纵的复杂而又强大的工具。虽然正则表达式比纯粹的文本匹配效率低,但是它却更灵活。按照它的语法规则,随需构造出的匹配模式就能够从原始文本中筛选出几乎任何你想要得到的字符组合。

对于初学正则表达式的学者,最困难的地方就是它语法中繁多杂乱的符号。所以大多数工作者,都在记忆中保存正则表达式的整体规范,而做不到完全记忆。确保自己手边有一套可靠的正则查找资料,或者能保证随时上网查询即可。对于正则的语法,这里我们捡常用的一些,加以分类介绍:

基本语法

以前我们用grep在一个文件中找出包含某些字符串的行,比如在头文件中找出一个宏定义。其实grep还可以找出符合某个模式(Pattern)的一类字符串。例如找出所有符合xxxxx@xxxx.xxx模式的字符串(也就是email地址),要求x字符可以是字母、数字、下划线、小数点或减号,email地址的每一部分可以有一个或多个x字符,例如abc.d@ef.com1_2@987-6.54,当然符合这个模式的不全是合法的email地址,但至少可以做一次初步筛选,筛掉a.b、c@d等肯定不是email地址的字符串。再比如,找出所有符合yyy.yyy.yyy.yyy模式的字符串(也就是IP地址),要求y是0-9的数字,IP地址的每一部分可以有1-3个y字符。
如果要用grep查找一个模式,如何表示这个模式,这一类字符串,而不是一个特定的字符串呢?从这两个简单的例子可以看出,要表示一个模式至少应该包含以下信息:
字符类(Character Class):如上例的x和y,它们在模式中表示一个字符,但是取值范围是一类字符中的任意一个。
数量限定符(Quantifier): 邮件地址的每一部分可以有一个或多个x字符,IP地址的每一部分可以有1-3个y字符。
各种字符类以及普通字符之间的位置关系:例如邮件地址分三部分,用普通字符@和.隔开,IP地址分四部分,用.隔开,每一部分都可以用字符类和数量限定符描述。为了表示位置关系,还有位置限定符(Anchor)的概念,将在下面介绍。
规定一些特殊语法表示字符类、数量限定符和位置关系,然后用这些特殊语法和普通字符一起表示一个模式,这就是正则表达式(Regular Expression)。例如email地址的正则表达式可以写成[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+.[a-zA-Z0-9_.-]+,IP地址的正则表达式可以写成[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}。下一节介绍正则表达式的语法,我们先看看正则表达式在egrep中怎么用。例如有这样一个文本文件regexp_test.txt:

192.168.1.1
1234.234.04.5678
123.4234.045.678
abcde
$ egrep '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' regexp_test.txt
192.168.1.1
1234.234.04.5678

egrep相当于grep -E,表示采用Extended正则表达式语法。书写测试时,注意不要省略 ‘ ‘

字符类:

正则表达式

数量限定符:

正则表达式

注意egrep找的是包含某一模式的行,而不是完全匹配某一模式的行。

例如有如下文本:

aaabc
aad
efg

查找a*这个模式的结果。会发现,三行都被找了出来。

$ egrep 'a*' regexp_test.txt
aaabc
aad
efg

a匹配0个或多个a,而第三行包含0个a,所以也包含了这一模式。单独用a这样的正则表达式做查找没什么意义,一般是把a*作为正则表达式的一部分来用。

位置限定符

正则表达式

位置限定符可以帮助egrep更准确地查找。
例如上一节我们用[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}查找IP地址,找到这两行

192.168.1.1
1234.234.04.5678

如果用^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$查找,就可以把1234.234.04.5678这一行过滤掉了。

其它特殊字符:

正则表达式

Go语言通过regexp(regular expression)标准包为正则表达式提供了官方支持,如果你已经使用过其他编程语言提供的正则相关功能,那么你应该对Go语言版本的不会太陌生。但是它们之间也有一些小的差异,因为Go实现的是RE2标准,详细的语法描述可参考:code.google.com/p/re2/wiki/Syntax 如遇无法打开,也可参看:

www.sun190.com/2015/01/re2-%E6%AD%A...

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
贡献者:1
讨论数量: 0
发起讨论 只看当前版本


暂无话题~