正则表达式入门到精通

在计算机科学里面有一个笑话:“如果你有一个问题打算用正则表达式来解决,那么就是两个问题来。”

正则表达式确实是一堆随机符号的混合物,感觉是一堆毫无意义生涩的符号,在实际开发的情况下可以直接在网上查找相应的正则表达式,再贴到自己的代码里面就可以来。但是在一些朋友写爬虫的时候,抓取需要的信息时,就遇到了一些问题,确实有其他的方法可以代替正则表达式, 但是知道一点总比不知道的好。

而正则表达式之所以叫正则表达式,是因为它们可以识别正则字符串,即我们给定一串字符串和相应的规定,就可以返回它, 如果字符串和规定不符合,则不返回。

比如我们想要重复任意次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
在爬虫里,如果我们要抓取一个网页,比如待抓取的网页是:“http://www.pythonscraping.com/pages/page3.html ”
我们想要<img src="../img/gifts/img3.jpg">

正则表达式就可以写成:re.compile("\.\.\/img\/gifts\/img.*\.jpg")

猜你喜欢

转载自blog.csdn.net/caoyu1221/article/details/80612370