正则表达式的使用
re.match(pattern,string,flags=0)
re.match尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none
参数介绍:
pattern:正则表达式
string:匹配的目标字符串
flags:匹配模式
正则表达式的匹配模式:
最常规的匹配
1
2
3
4
5
6
7
|
import re content = 'hello 123456 world_this is a regex demo' print ( len (content)) result = re.match( '^hello\s\d{6}\s\w{10}.*demo$$' ,content) print (result) print (result.group()) #返回匹配结果 print (result.span()) #返回匹配结果的范围 |
结果运行如下:
39
<_sre.sre_match object; span=(0, 39), match='hello 123456 world_this is a regex demo'>
hello 123456 world_this is a regex demo
(0, 39)
泛匹配
使用(.*)匹配更多内容
1
2
3
4
5
|
import re content = 'hello 123456 world_this is a regex demo' result = re.match( '^hello.*demo$' ,content) print (result) print (result.group()) |
结果运行如下:
<_sre.sre_match object; span=(0, 39), match='hello 123456 world_this is a regex demo'>
hello 123456 world_this is a regex demo
匹配目标
在正则表达式中使用()将要获取的内容括起来
使用group(1)获取第一处,group(2)获取第二处,如此可以提取我们想要获取的内容
1
2
3
4
5
|
import re content = 'hello 123456 world_this is a regex demo' result = re.match( '^hello\s(\d{6})\s.*demo$' ,content) print (result) print (result.group( 1 )) #获取匹配目标 |
结果运行如下:
<_sre.sre_match object; span=(0, 39), match='hello 123456 world_this is a regex demo'>
123456
贪婪匹配
1
2
3
4
5
|
import re content = 'hello 123456 world_this is a regex demo' result = re.match( '^he.*(\d+).*demo$' ,content) print (result) print (result.group( 1 )) |
注意:.*会尽可能的多匹配字符
非贪婪匹配
1
2
3
4
5
|
import re content = 'hello 123456 world_this is a regex demo' result = re.match( '^he.*?(\d+).*demo$' ,content) print (result) print (result.group( 1 )) |
注意:.*?会尽可能匹配少的字符
使用匹配模式
在解析html代码时会有换行,这时我们就要使用re.s
1
2
3
4
5
6
|
import re content = 'hello 123456 world_this ' \ 'is a regex demo' result = re.match( '^he.*?(\d+).*?demo$' ,content,re.s) print (result) print (result.group( 1 )) |
运行结果如下:
<_sre.sre_match object; span=(0, 39), match='hello 123456 world_this is a regex demo'>
123456
转义
在解析过程中遇到特殊字符,就需要做转义,比如下面的$符号。
1
2
3
4
|
import re content = 'price is $5.00' result = re.match( '^price.*\$5\.00' ,content) print (result.group()) |
总结:尽量使用泛匹配,使用括号得到匹配目标,尽量使用非贪婪模式,有换行就用re.s
1
|
re.search(pattern,string,flags = 0 ) |
re.search扫描整个字符串并返回第一个成功的匹配。
比如我想要提取字符串中的123456,使用match方法无法提取,只能使用search方法。
1
2
3
4
5
6
7
8
9
|
import re content = 'hello 123456 world_this is a regex demo' result = re.match( '\d{6}' ,content) print (result) import re content = 'hello 123456 world_this is a regex demo' result = re.search( '\d{6}' ,content) print (result) print (result.group()) |
运行结果如下:
<_sre.sre_match object; span=(6, 12), match='123456'>
匹配演练
可以匹配代码里结构相同的部分,这样可以返回你需要的内容
1
2
3
4
5
6
|
import re content = '<a python" id="highlighter_960028">
|