正则表达式的学习

粗略的浏览

Posted by Jow on April 25, 2019

目录

  1. Egrep元字符
  2. 常用的正则表达式

在学习爬虫的时候就想认真的好好研究一下正则表达式,当时只是想快点爬到自己想要的东西,真的欲速则不达,自己似乎没有成功过。 回来看看自己现在好好学习正则表达式,什么是自己解决不了的呢?

Egrep元字符

行的起始和结束,在这里 ’^’ 表示行的开始,而 “$”表示行的结束。

1
2
^cat   -->表示匹配以cat开头的行
cat$   -->表示匹配以cat结尾的行

字符组

元字符: []

匹配若干个字符之一,使用“[]”,表示匹配中括号中的任意一个字符就是满足的。表达的意思是或。

字符组的意思是在同一个位置能够匹配若干个字符。一个字符就是满足的,这个和下面的 ‘ ’ 存在很大的区别

元字符: -

在字符组中使用 “-”表示什么范围,a-d 表示 “a,b,c,d” ,1-4表示1,2,3,4。 只用在字符组内部“-”才是元字符而且不是第一个字符。

1
2
[abcd]at  -->aat\bat\cat\dat  这些都是满足匹配规则的。
[a-d]at   -->和上面表达的意思一致,

元字符: ^

在字符组的开头添加”^”起着排除的作用,只有在字符组的开头。一个字符组即使是一个排他性的字符组至少也需要匹配一个字符

元字符: .

元字符”.”匹配任意字符的字符组的简便写法。

1
'03.19.76'  or 03[-./]19[-./]76

上面那两种写法都可以匹配到 03.19.76,03-19-76,03/19/76 。但是后面哪一种更加的精确,前面哪一种由于点的存在会匹配到除了三个意外其它的。

’-‘在字符组的开头不是元字符,’.’在字符组中不是元字符

元字符: |

元字符’ ‘的意思也是,但是它“或”的是总表达式,这个总表达式又能匹配任意的子表达式。在这里子表达式被称为“多选分支”,所以使用” “的“或”是多选结构。
在字符组中,’ ‘表达的是字符而不是元字符。多选结构可以包括很多字符。但是不能超过小括号的界限。一般一个多选结构都是使用’()’进行括起来的。
1
(Fir|1)st [Ss]atr

上面就是多选结构匹配First或者1st都是正确的。

所以看出’[]’和’ ‘的区别在于:一个字符组只能匹配目标文本中的单个字符,而每个多选结构自身都可能是完整的正则表达式,都可以匹配任意长度的文本。

忽略大小写

在egrep中可以使用 -i 来进行忽略大小写的匹配,不用自己写[Ss]这样的字符组。如下:

1
Egrep -i '^(From|Subject|Data): ' -->FROM: 

单词分界符: \> \<

1
2
3
\<cat\> -->匹配cat这个单词
\<cat -->匹配以cat为开头的单词
cat\> -->匹配以cat结尾的单词

字符’<’和’>’本身并不是元字符只有他们和斜线连起来的时候整个序列才有意义,所以我们称之为元字符序列。

总结

  1. ’.’ 单个任意字符
  2. ‘[…]’ 列出的任意字符
  3. [^…] 未列出的任意字符
  4. ^ 行的起始位置
  5. $ 行的结束位置
  6. < 单词的起始位置
  7. > 单词的结束位置
  8. 匹配分隔符两边的任意一个表达式
  9. (…) 限制竖线的作用范围

attention

  1. 在字符组内一个意思,外可能又是另一个意思,在不同的位置又可能表达其它意思,所以要记清楚字符在什么时候表达元字符的意思。
  2. 不要混淆字符组和多选项,它们最大的区别在于,前者只能匹配一个字符,后者匹配任意个。

可选项元素

可选项: ?

问号的元字符作用于之前紧邻的元素,表达的意思是此处容许出现这个元素,但不是匹配成功的必要条件。 简单点说就是这里出现和不出现这个元素匹配都是成功的。 一般使用括号来界定’?’元字符作用的对象。

1
(th)?4  -->th4 和 4 都是正确的

其它量词:重复出现

星号 : ‘*’ 代表可以重复出现0次或者多次 加号 :’+’ 代表1次或者多次 问号 : ‘?’ 代表可以出现0次或者一次 区间:{数字,数字} 代表可以出现的次数在这两个数之间

它们都是量词,作用于它们之前的一个元素,这个元素最好使用括号括起来便于理解。约束前一个元素出现的次数。

括号及反向引用

括号能够记住他们包含子表达式匹配的文本,然后通过使用 \1 or \2 … 来得到括号记住的文本

1
(0-9)(a-z)\1\2  --> \1  等于(0-9)匹配的内容,\2 等于(a-z)匹配的内容 可以匹配:1a1a

神奇的转义

可以使用’'来对元字符进行转义让其成为一个普通的字符,但在字符组中不行,在字符组中’'就是一个普通的字符。

1
\.  -->这样来匹配点 

attention:斜线和大于小于以及数字会组成元字符序列

常用的正则表达式

1
2
3
4
5
6
变量名
[a-zA-Z_][a-zA-Z0-9]*
引号内的字符串
"[^"]*"
美元金额
\$[0-9]+(\.[0-9]+)?