正则表达式
正则表达式这么叫,是因为他们可以识别正则字符串,
也就是说,它们可以这么定义:“如果你给我的字符串符合规则,我就返回它”,或者是“如果字符串不符合规则,我就忽略它”
学好正则表达式,对于爬虫中,有效信息的提取是非常有帮助的,至少我现在希望在杂乱无章的信息中,找到我所需要的文件。
对于一个简单的正则表达式
aa*bbbbb(cc)*(d|)
进行分解:
aa*:
a 后面跟着的 a*(读作 a 星)表示“重复任意次 a,包括 0 次”。这样就可以保证字母 a至少出现一次。
bbbbb:
就是连续五个b
(cc)*:
表示有任意多个cc(同样也可是是0个)
(d|):
表示有一个d或者没有,就是逻辑或的意思
那么我们在来分析一个邮箱
规则 | 正则表达式 |
---|---|
邮箱地址的第一部分至少包括一种类型:大写字母,小写字母,数字0~9,点号,加号,或下划线 | [A-Za-z0-9\._+]+:这个正则表达式简写,A-Z,a-z,0-9分别表示大写字母,小写字母和数字,所有放在中括号里面表示出现一次,即一个字母,后面还有一个加号表示这些符号都可以出现多次,且至少出现一次 |
邮箱还包含一个@符号 | 直接出现一个@符号即可 |
在符号@之后,邮箱地址还至少包含一个大写或小写字母 | [A-Za-z] |
之后跟一个点号(.) | \.:域名前面必须有 |
最后还有结尾符 | (com|org|edu|net) |
完整的正则表达式:
[A-Za-z0-9\._+]+@[A-Za-z]+\.(com|org|edu|net)
常见的Python中的正则表达式
符号 | 含义 | 例子 | 匹配结果 |
---|---|---|---|
* | 匹配前面字符,子表达式或括号里面的字符0次或多次 | a*b* | aaaaaa,abbbb,bbb |
+ | 匹配前面的字符,子表达式或括号里面至少一次 | a+b+ | abb |
[] | 匹配任意一个字符 | [A-Z] | A |
() | 表达式编组 | (a*b)* | aaab |
{m,n} | 匹配前面的字符、子表达式或括号里的字符 m 到n次(包括m,n) | a{2,3}b{2,3} | aabbb |
[^] | 匹配任意一个不在括号里面的字符 | [^A-Z]* | apple |
| | 理解为或运算符 | b(a|i|e)d | bad,bid,bed |
. | 匹配任意单个字符(包括符号,子表达式) | b.d | bad,bid,b$d |
\ | 转义字符(把有特殊含义的字符转化为普通字符) | \.\ | \\ | .|\ |
$ | 表示从字符串的末端匹配 | [A-Z]*[a-z]*$ | ABCabc,zzzyx |
^ | 指字符串开始位置的字符或子表达式 | ^a | Apple,aaad |
?! | “不包含”。这个奇怪的组合通常放在字符或正则表达式前面,表示字符不能出现在目标字符串里。这个符号比较难用,字符通常会在字符串的不同部位出现。如果要在整个字符串中全部排除某个字符,就加上 ^ 和 $ 符号 | ^((?![A-Z]).)*$ | (就是不能包含大写字母) |