在计算机科学里面有一个笑话:“如果你有一个问题打算用正则表达式来解决,那么就是两个问题来。”
正则表达式确实是一堆随机符号的混合物,感觉是一堆毫无意义生涩的符号,在实际开发的情况下可以直接在网上查找相应的正则表达式,再贴到自己的代码里面就可以来。但是在一些朋友写爬虫的时候,抓取需要的信息时,就遇到了一些问题,确实有其他的方法可以代替正则表达式, 但是知道一点总比不知道的好。
而正则表达式之所以叫正则表达式,是因为它们可以识别正则字符串,即我们给定一串字符串和相应的规定,就可以返回它, 如果字符串和规定不符合,则不返回。
比如我们想要重复任意次a, 用aa*就可以了。 a后面跟着的a*表示重复任意次a,包括0次。
“ | ”则表示或的关系,即A或B。
下面我们来讲正则表达式的规则。
规则 | 正则表达式 |
1. 邮箱地址的第一部分至少包括一种内容:大写字母、小写字母、数字0~9、点号(.)、加号(+)或下划线(_) | [A-Za-z0-9\._+]:这个正则表达式简写非常简单。例如,它用"A-Z"表示任意A~Z的大写字母。“把所有可能的序列和符号放在中括号(不是小括号)里表示“括号中的符号里任何一个”。要注意后面的加号,它表示“这些符号都可以出现多次,且至少出现 1 次” |
2.邮箱地址包含的@符号 | @:这个符号很直接。“@ 符号必须出现在中间位置,有且仅有 1 ”次。 |
3. “在符合 @ 之后,邮箱地址还必须至少包含一个大写或小写字母” |
“[A-Za-z]+:可能只在域名的前半部分、符号 @ 后面用字母。而且,至少有一个字母” |
4. “之后跟一个点号(.)” |
“\.:在域名前必须有一个点号(.)” |
5. “最后邮箱地址用 com、org、edu、net 结尾(实际上,顶级域名有很多种可能,但是作为示例演示这四个后缀够用了)。” |
“(com|org|edu|net):这样列出了邮箱地址中可能出现在点号之后的字母序列” |
将这些连在一起,就可以表达出一个正则表达式了:“[A-Za-z0-9\._+]+@[A-Za-z]+\.(com|org|edu|net)”。
而当我们在写正则表达式的时候,可以先写一个列表描述目标字符串结构。
以下是正则表达式的常用符号:
符号 | 含义 | 例子 | 匹配结果 |
* | 匹配前面的字符、子表达式或括号里的字符0次或多次 | a*b* | aaaaaaaa, aaabbbbb, bbbbbb |
+ | 匹配前面的字符、子表达式或括号里的字符至少1次 | a+b+ | aaaaaaab, aaabbbbb, abbbbbb |
[ ] | 匹配任意一个字符(相当于“任选一个”) | [A-Z]* | APPLE, CAPITALS, QWERTY |
( ) | 表达式编组(在正则表达式的规则里编组会优先运行) | (a*b)* | aaabaab, abaaab, ababaaaaab |
{m,n} | 匹配前面的字符、子表达式或括号里的字符m到n次(包含m或n) | a{2,3}b{2,3} | aabbb, aaabbb, aabb |
[^] | 匹配任意一个不在中括号里的字符 | [^A-Z]* | apple, lowercase, qwerty |
| | 匹配任意一个由竖线分割的字符、子表达式(注意是竖线,不是大写字母I) | b(a|i|e)d | bad, bid, bed |
. | 匹配任意单个字符(包括符号、数字和空格等) | b.d | bad, bzd, b$d, b d |
^ | 指字符串开始位置的字符或子表达式 | ^a | apple, asdf, a |
\ | 转义字符(把有特殊含义的字符转成字面形式) | \.\ | \\ | .| \ |
$ | 经常用在正则表达式的末尾,表示“从字符串的末端匹配”。如果不用它,每个正则表达式实际都带着“.*”模式,只会从字符串开头进行匹配。这个符号可以看成是^符号的反义词 | [A-Z]*[a-z]*$ | ABCabc, zzzyx, Bob |
?! | “不包含”。这个组合通常放在字符或正则表达式前面,表示字符不能出现在目标字符串里。这个符号比较难用,字符通常会在字符串的不同部位出现。如果要在整个字符串中全部排除某个字符,就加上^和$符号 | ^((?![A-Z]).)*$ | no-caps-here, $ymb01s a4ef!ne |
我们想要<img src="../img/gifts/img3.jpg">
正则表达式就可以写成:re.compile("\.\.\/img\/gifts\/img.*\.jpg")