欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

正则表达式入门

程序员文章站 2022-04-19 18:09:01
...
cjx最近在做爬虫的项目,急切需要在页面中抓取自己想要的内容,但是通过逻辑判断获取实在是过于复杂。很庆幸有正则表达式这个利器,很多事情都能够轻松办到,cjx之前也有了解一些关于正则表达式的知识。不过一直处于理解不彻底的状态,很难有效的自己编写一个满意的正则表达式出来。最近在网上发现有本Jeffrey E.F.Fried写的 精通正则表达式。 看了第一章后突然发现自己能写几个正则了,呵呵~~~ cjx突然有一种从屌丝升级成高富帅的感脚...下面对书上的第一章做了下总结~

行的起始和结束

或许最容易理解的元字符就是脱字符号^和美元符号$了,在检查一行文本时,^代表一行的开始,$代表结束。

读者最好养成按照字符来理解正则表达式的习惯。 例如,不要这样:

  ^cat 匹配以cat开头的行

而应该这样理解:

  ^cat 匹配的是以c作为一行的第一个字符,紧接一个a,紧接一个t的文本。

这两种理解的结果并无差异,但按照字符来解读更易于明白新遇到的正则表达式的内部逻辑。

匹配若干字符之一

如果我们需要搜索的是单词"grey",同时又不确定它是否写作"gray",就可以使用正则表达式结构体[...]。它容许使用者列出在某处期望的匹配的字符,通常被称作字符组。

所以,gr[ea]y的意思是:先找到g,跟着的是一个r,然后是一个a或者e,最后是一个y。

在字符组内部,字符租元字符 '-' 表示一个范围: <H[1-6]> 与 <H[123456]> 是完全一样的。我们还可以随心所欲地把字符范围与普通文本结合起来:

[0-9A-Z_!.?] 能够匹配一个数字、大写字母、下划线、惊态号、点号或者是问号。

排除型字符组

用[^...] 来取代 [...] 这个字符组就会匹配任何未列出的字符。例如:[^1-6] 匹配了除了1到6以外的任何字符。这个组中开头的^表示排除,所以这里列出的不是希望匹配的字符,而是不希望匹配的字符。

用点号匹配任意字符

元字符. 是用来匹配任意字符的字符组的简便写法。如果我们需要在表达式中使用一个"匹配任何字符" 的占位符,用点号就很方便。


匹配任意子表达式

元字符 | 是一个非常简洁的元字符,它的意思就"或" 。依靠它,我们能够把不同的子表达式组合一个总的表达式,而这个总的表达式又能够匹配任意的子表达式。

可选项元素

现在来看color和colour的匹配。它们的区别在于,后面的单词比前面的多一个u,我们可以用coloru?r 来解决这个问题。元字符? (也就是问号)代表可选项。把它加在一个字符的后面,就表示此处容许出现这个字符,不过它的出现并非匹配成功的必要条件。

其他量词:重复出现

+(加号)和*(星号)的作用与问号类似。元字符+ 表示之前紧邻的元素出现一次或多次,而* 表示之前紧邻的元素出现任意多次,或者不出现。
接下来看类似 <HR SIZE=14> 这样的TAG,它表示一条高度为14的水平线。此外HR 与SIZE 之间必须有一个空格,而等号两边可以没有空格。于是若要找到网页中这样的HR,表达式既被写成 <HR +SIZE *= *14 *>,有的时候HR的SIZE值往往是可变的,还有有可能不存在SIZE属性。那么表达式又可以被改写成<HR( +SIZE *= *[0-9]+)? *>。哇哦,真是太神奇了。

括号及反向引用

到目前为止,我们已经见过括号的两种用途:1.限制多选项的范围;2.将若干字符组合为一个单元,受问号或星号之类量词作用。现在我要介绍括号的另外一种用途即反向引用,虽然它在egrep中并不常见(不过流行的GNU版本确实支持这一功能),但在其他工具软件中很常见。
在支持反向引用的工具软件中,括号能够"记忆"其中的子表达式匹配的文本,不论这些文本是什么,元字符序列\1 都能够记住它们。

当然,在一个表达式中我们可以使用多个括号。再用\1、\2、\3等来表示第一、第二、第三组括号匹配的文本。括号是按照开括号'(' 从左到右的出现顺序来进行的,所以 ([a-z])([0-9])\1\2 中的\1代表[a-z] 匹配的内容,而\2 代表[0-9]匹配的内容。

神奇的转义
就是有的时候,我们可能需要匹配一些.+*?等符号,但是同时发现他们又是元符号。于是我们可以在它们的前面加上一个\ 转义符来实现这些特殊元符号的匹配。

一些有用的简记
\t 制表符
\n 换行符
\r 回车符
\s 任何空白字符,如空格、换行、tab缩进等所有的空白符
\S 除\s 之外的任何字符
\w [a-zA-Z0-9] 在\w+ 中非常有用,可以用来匹配一个单词
\W 除\w 之外的任何字符
\d [0-9],即数字
\D 除\d 外的任何字符,即[^0-9]