好久没复习Python了,感觉很多东西都快忘了,趁着假期赶紧补一补基础
什么是正则
正则表达式使用单个字符串来描述,匹配一系列符合某个句法规则的字符串,简单理解,就是对字符串的检索匹配和处理
Python 正则表达式
Python通过re模块提供对正则表达式的支持
1.先将正则表达式的字符串形式编译为Pattern实例;
2.使用Pattern实例处理文本并获得匹配结果;
3.使用实例获得信息,进行其他的操作。
先熟知几个re模块常用的函数:
(1)re.compile(pattern,flags=0)
re.match(pattern,string,flags=0)
来看下面一个例子:
1 | import re |
这个例子使用了re模块的compile函数生成一个正则表达式的pattern对象,该对象拥有一系列方法用于正则表达式的匹配和替换,简单而言就是规定了匹配的模式,而match函数则用来匹配,匹配成功则返回一个match对象,match对象通过group()返回被RE匹配的字符串
(2)re.findall(pattern,string,flags=0)
来看下面一个例子:
1 | import re |
这个例子使用了re模块的findall函数遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表,跟compile函数不同在于,findall函数能搜素出所有符合的字符串组成一个列表
(3)re.search(pattern,string,flags=0)
来看下面一个例子:
1 | import re |
这个例子使用了re模块的search函数,跟match函数一样,只找到第一个匹配的字符串然后返回一个match对象
实例
抓取i春秋网页的课程信息
代码如下:
1 | import requests |
输出结果:
最后这里因为中文英文字符所占字节不同,所以死活对不齐…也利用了chr(12288)填充的办法还是行不通,希望有大神能告知如何解决,感激不尽
特殊字符
一般字符 | 匹配自身 | abc | abc |
---|---|---|---|
. | 匹配任意换行符”\n”以外的字符 | a.c | abc |
\ | 转义字符,是最后一个字符改变原来的意思。用于在正则表达式中转义一些特殊字符 | a\.c a\\c |
a.c a\c |
[…] | 字符集。对应的位置可以是字符串集中任意1个字符。字符集中的字符可以逐个列出,也可以给出范围,如[abc]或[a-c],第一个字符如果是^则表示取反,如[^abc] 表示不是abc的其他字符。所有的特殊字符在字符集中都失去原来的特殊含义,在字符集中如果要使用],-或^,可以在前面加上反斜杠 |
a[bcd]e | abe ace ade |
字符集
预定义字符(可以写在[…]中) | 含义 | 例子 | 符合匹配的例子 |
---|---|---|---|
\d | 数字:[0-9] | a\dc | a1c,a9c |
\D | 非数字:[^\d] |
a\Dc | abc,a c |
\s | 空白字符:[<空格>\t\r\f\v] | a\sc | a c |
\S | 非空白字符:[^\s] |
a\Sc | abc,a1c |
\w | 单词字符:[A-Za-z0-9] | a\wc | abc,a1c,aBc |
\W | 非单词字符:[^\w] |
a\Wc | a c,a.c |
数量词
数量词 | 含义 | 例子 | 符合匹配的例子 |
---|---|---|---|
* | 匹配前一次字符0次或无限次 | abc* | ab,abccc |
+ | 匹配前一个字符1次或无限次 | abc+ | abc,abccc |
? | 匹配前一个字符0次或1次 | abc? | ab,abc |
{m} | 匹配前一个字符m次 | ab{2}c | abbc |
{m,n} | 匹配前一个字符m到n次 | ab{1,2}c | abc,abbc |
逻辑,分组
字符 | 含义 | 例子 | 符合匹配的例子 |
---|---|---|---|
或运算符 | 代表左右表达式任意匹配一个,它总是先尝试匹配左边的表达式,一旦成功匹配则跳过右边的表达式,如果或运算符没有包括在()中,则它的范围是整个正则表达式 | abc或def | abc def |
(…) | 被括起来的表达式将作为分组,从表达式左边开始每遇到一个分组的左括号,编号+1分组表达式作为一个整体,可以后接数量词,表达式中或运算符仅在该组中有效 | (abc){2} a(123或456)c | abcabc a123c,a456c |
贪婪模式和非贪婪模式
正则表达式通常用于在文本中查找匹配的字符串。Python里的数量词默认是贪婪的,意思是总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符。
例如:正则表达式”ab*“如果用于查找”abbbc”,将匹配到”abbb”。而如果使用非贪婪方法(在数量词后面加上?,则使用非贪婪方法匹配),如”ab*?”,将找到”a”