刚开始学习python解析页面的时候,就知道了常用有三种解析方式,即BeautifulSoup、Xpath、正则表达式。最开始我是用BeautifulSoup,后来学了selenium,就开始喜欢用xpath,再后来接触了scrapy,就放弃BeautifulSoup直接上xpath(BeautifulSoup学的也是皮毛,没细学)。而正则表达式也看了下,但是真的有点复杂,就没仔细研究,也几乎没用过。
然而,山水总相逢,在django配置url.py的时候,还是绕不过正则表达式。所以啊,世上本无捷径。
总结语法如下:
1、‘^’,开始字符:"^The":表示所有以"The"开始的字符串("There","The cat"等);
2、‘$’,结束字符:"of despair$":表示所以以"of despair"结尾的字符串;
3、二者都没有:"notice":表示任何包含"notice"的字符串;
4、‘*’,表示重复前面一个字符,0次或者多次
5、‘+’,表示重复前面一个字符,1次或者多次
6、‘?’,表示重复前面一个字符,0次或者1次
7、也可以使用范围,用大括号括起,用以表示重复次数的范围:
"ab":表示一个字符串有一个a跟着2个b("abb");
"ab":表示一个字符串有一个a跟着至少2个b;
"ab":表示一个字符串有一个a跟着3到5个b;
8、‘|’,表示或,在两个或者多个项目中选择
9、‘.’,可以代表任意一个字符:
"a.[0-9]":表示一个字符串有一个"a"后面跟着一个任意字符和一个数字;
"^.$":表示有任意三个字符的字符串(长度为3个字符);
10、‘[ ]’,表示允许其中的某一个(只是一个字符)可以出现
"[ab]":表示一个字符串有一个"a"或"b"(相当于"a¦b");
"[a-d]":表示一个字符串包含小写的'a'到'd'中的一个(相当于"a¦b¦c¦d"或者"[abcd]");
"^[a-zA-Z]":表示一个以字母开头的字符串;
"[0-9]%":表示一个百分号前有一位的数字;
",[a-zA-Z0-9]$":表示一个字符串以一个逗号后面跟着一个字母或数字结束。
你也可以在方括号里用'^'表示不希望出现的字符,'^'应在方括号里的第一位。(如:"%[^a-zA-Z]%"表示两个百分号中不应该出现字母)。
11、"\d": 匹配数字:
12、"\w":匹配字母,数字,下划线:
例如我要匹配"a2345BCD__TTz" 正则:"\w+" 这里的"+"字符为一个量词指重复的次数,稍后会详细介绍。
13、"\s":匹配空格 :
例如字符 "a b c" 正则:"\w\s\w\s\w" 一个字符后跟一个空格,如有字符间有多个空格直接把"\s" 写成 "\s+" 让空格重复
14、反义:写法很简单改成大写就行了,意思与原来的相反
"\W" 匹配任意不是字母,数字,下划线 的字符
"\S" 匹配任意不是空白符的字符
"\D" 匹配任意非数字的字符
"\B" 匹配不是单词开头或结束的位置
"[^abc]" 匹配除了abc以外的任意字符
15、 懒惰限定符:
"*?" 重复任意次,但尽可能少重复 :
如 "acbacb" 正则 "a.*?b" 只会取到第一个"acb" 原本可以全部取到但加了限定符后,只会匹配尽可能少的字符 ,而"acbacb"最少字符的结果就是"acb"
"+?" 重复1次或更多次,但尽可能少重复:
与上面一样,只是至少要重复1次
"??" 重复0次或1次,但尽可能少重复:
如 "aaacb" 正则 "a.??b" 只会取到最后的三个字符"acb"
"?" 重复n到m次,但尽可能少重复:
如 "aaaaaaaa" 正则 "a?" 因为最少是0次所以取到结果为空
"?" 重复n次以上,但尽可能少重复:
如 "aaaaaaa" 正则 "a?" 最少是1次所以取到结果为 "a"
上面的初级的正则规则基本可以解决大部分需求了,进阶的先不补充了。
此外,再贴一个正则的在线测试网址:http://tool.oschina.net/regex/
领取专属 10元无门槛券
私享最新 技术干货