今天看python网络数据采集,看到了正则表达式部分,感觉挺有趣的,记录下来
首先为什么叫正则表达式——它可以识别正则字符串
什么是正则字符串——任意可以用一系列线性规律构成的字符串
例子一:
1)字母a至少出现一次;
2)后面跟着字母b重复5次;
3)后面再跟着字母c重复任意偶数次;
4)最后一位是字母d,也可以没有。
满足规则的字符串有很多:“abbbbbcccc” “aaabbbbbccd” “abbbbbd”
正则表达式就是表达这组规则的缩写,这组规则的正则表达式如下:
aa*bbbbb(cc)*(d| )
分析:
条件一:a至少有一个,有一个,a;有多个,a*(读作a星),a*表示“重复任意次a,包括0次”。
aa*满足条件一
条件二:b重复5次,没什么说的,bbbbb
条件三:c重复任意偶数次,(cc)*表示“重复任意次cc,包括0次”,满足条件三
条件四:最后一位是字母是字母d,也可以没有,(d| ),(|)在表达式里表达“这个或那个”,本例表示“增加一个后面跟着空格的d,或者只有一个空格”
例子二:识别邮箱地址
规则一:地址第一部分至少包括一种内容:大写字母/小写字母/数字0-9/点号(.)/加号(+)/或下划线(_)
正则表达式为:[A-Za-z0-9\._+]+
A-Z表示“任意A-Z的大写字母”,把所有可能的序列和符号放在中括号里,表示“括号里的任何一个”;后面的加号,他表示“这些符号都可以出现多次,且至少出现1次”
规则二:第二部分包含一个@符号
正则表达式为@
规则三:第三部分必须至少包含一个大写或小写字母
正则表达式为:[A-Za-z]+ 满足至少有一个字母
规则四:第四部分为一个点号(.)
正则表达式为\. 要有斜杠,不知道为什么,以后补充原因
规则五:以com/org/edu/net结尾
正则表达式为(com|org|edu|net) 列出可能出现的字母序列
综上,完整的正则表达式:[A-Za-z-0-9\._+]+@[A-Za-z]+\.(com|org|edu|net)
最后是正则表达式常用符号:
1)符号 * 例子为a*b* 结果为aaaaa,aaaabbbbb,bbbbb等
含义:匹配前面的字符/子表达式或括号里的字符0次或多次
2)符号 + 例子为a+b+ 结果为aaaaab,aaaabbbbb,abbbbb等
含义:匹配前面的字符/子表达式或括号里的字符至少1次
3) 符号 [] 例子为[A-Z]* 结果为APPLE,CAPITALS,QWERTY等
含义:匹配任意一个字符(相当于“任选一个”)
4) 符号 () 例子为(a*b)* 结果为aaabaab,abaaab,abababababa等
含义:表达式编组(在正则表达式的规则里编组会优先运行)
5)符号 {m,n} 例子为a{2,3}b{2,3} 结果为aabbb,aaabbb,aabb,aaabb
含义:匹配前面的字符/子表达式或括号里的字符m到n次(包含m或n)
6)符号 [^] 例子为[^A-Z]* 结果为apple,lowercase,pwerty
含义:匹配任意一个不在中括号的字符
7)符号 | 例子为b(a|i|e)d 结果为bad,bid,bed
含义:匹配任意一个由竖线分割的字符(注意该符号为竖线)
8)符号 . 例子为b.d 结果为bad,bzd,b$d,b d
含义:匹配任意单个字符(包括符号/字母和空格)
9)符号 ^ 例子为^a 结果为apple,asdf,a等
含义:指字符串开始位置的字符或子表达式
10)符号 \ 例子为\. \| \\ 结果为 . | \
含义:转义字符(把有特殊含义的字符转换为字面形式)
11) 符号 $ 例子为[A-Z]*[a-z]*$ 结果为ABCabc,zzzyx,Bob等
含义:常用在正则表达式的末尾,表示“从字符串的末端匹配”。可看作^符号的反义词
12)符号 ?! 例子为^((?![A-Z]).)*$ 结果为no-caps-here,$ymb0ls,a4e f!ne
含义:不包含。这个奇怪组合通常放在字符或正则表达式前面,表示字符串不能出现在目标字符串里。这个符号比较难用,字符通常会在字符串的不同部位出现。如果要在整个字符串中全部排除某个字符,就加上^和$符号
注:本部分的正则表达式适用于python,在java等部分不适用,大家注意。