python正则表达式
1、面向的问题
01、判断一个字符串是否匹配给定的格式(判断用户注册账号是否满足格式)
02、从字符串中按指定格式提取信息(抓取页面中的链接)
import re
s = '12345678@aaa.com'
z = r'^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.com$'
m = re.findall(z, s)
print(m)
['12345678@aaa.com']
import re
a = '123456789'
z = r'^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.com$'
m = re.findall(z, a)
print(m)
[]
2、re模块
01、findall 方法:在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表
02、match 方法:re.match 尝试从字符串的起始位置匹配一个模式,匹配成功返回的是一个匹配对象(这个对象包含了我们匹配的信息),如果不是起始位置匹配成功的话,match()返回的是空 match只能匹配到一个
import re
s = 'Python123456python'
m = re.match(r'Py', s) #从字符起始位置开始查找
print(m)
<re.Match object; span=(0, 2), match='Py'>
import re
s = 'Python123456python'
m = re.match(r'Py', s) #从字符起始位置开始查找
m = m.group()
print(m)
Py
import re
s = 'Python123456python'
m = re.match(r'Py', s) #从字符起始位置开始查找
m = m.span()
print(m)
(0, 2)
03、search方法
re.search 扫描整个字符串,匹配成功返回的是一个匹配对象(这个对象包含了我们匹配的信息)
注意:search也只能匹配到一个,找到符合规则的就返回,不会一直往后找
re.match与re.search的区别:re.match只匹配字符串的开始位置找,如果字符串开始不符合正则表达式,则匹配失败,re.search:匹配整个字符串,如果一直找不到则,返回时空的,没有结果
import re
s = 'Python123456python'
m = re.search(r'Python', s)
print(m.group())
Python
3、元字符
元字符就是符号,代表一些特殊含义 \可以取消转义
01、 . 点代表任意一个字符
import re
s = 'Python123456python'
m = re.findall(r'.', s)
print(m)
['P', 'y', 't', 'h', 'o', 'n', '1', '2', '3', '4', '5', '6', 'p', 'y', 't', 'h', 'o', 'n']
02、[] 匹配[]中列举的字符 范围
import re
s = 'Python123456python'
m = re.findall(r'[0-9]', s)
print(m)
['1', '2', '3', '4', '5', '6']
03、 \d 匹配数字 即0-9 预定义字符组
import re
s = 'Python123456python'
m = re.findall(r'\d', s)
print(m)
['1', '2', '3', '4', '5', '6']
04、\D 匹配非数字
import re
s = 'Python123456python'
m = re.findall(r'\D', s)
print(m)
['P', 'y', 't', 'h', 'o', 'n', 'p', 'y', 't', 'h', 'o', 'n']
05、\s 匹配空白,即空格,tab键
import re
s = 'Python 123456python'
m = re.findall(r'\s', s)
print(m)
[' ', ' ', ' ']
06、 \S 匹配非空白
import re
s = 'Python 123456python'
m = re.findall(r'\S', s)
print(m)
['P', 'y', 't', 'h', 'o', 'n', '1', '2', '3', '4', '5', '6', 'p', 'y', 't', 'h', 'o', 'n']
07、 \w 匹配单词字符,即a-z A-Z 0-9 _
import re
s = 'Python123456python'
m = re.findall(r'\w', s)
print(m)
['P', 'y', 't', 'h', 'o', 'n', '1', '2', '3', '4', '5', '6', 'p', 'y', 't', 'h', 'o', 'n']
08、 \W 匹配非单词字符
import re
s = 'Python123456python'
m = re.findall(r'\W', s)
print(m)
[]
09、* 匹配前一个字符出现0次或者无限次,即可有可无
import re
s = 'Python123456python'
m = re.findall(r'.*', s)
print(m)
['Python123456python', '']
010、 + 匹配前一个字符出现1次或者无限次,即至少有1次
import re
s = 'Python123456python'
m = re.findall(r'y+', s)
print(m)
['y', 'y']
011、 ? 匹配前一个字符出现1次或者0次,即要么有1次,要么没有
import re
s = 'Python123456python'
m = re.findall(r'y?', s)
print(m)
['', 'y', '', '', '', '', '', '', '', '', '', '', '', 'y', '', '', '', '', '']
012、 {m} 匹配前一个字符出现m次 控制匹配次数
import re
s = 'Python123456python'
m = re.findall(r'.{3}', s)
print(m)
['Pyt', 'hon', '123', '456', 'pyt', 'hon']
013、{m,} 匹配前一个字符至少出现m次
014、 {m,n} 匹配前一个字符出现从m次n次
import re
s = 'aaa1bbb2ccc1234ddddeee'
m = re.findall(r'[0-9]{2,9}', s)
print(m)
['1234']
015、^ 匹配字符串开头
import re
s = 'abccccccd'
m = re.findall(r'^a', s)
print(m)
['a']
016、 $ 匹配字符串结尾
import re
s = 'abccccccd'
m = re.findall(r'd$', s)
print(m)
['d']
017、 \b 匹配一个单词的边界
import re
s = 'abccccccd'
m = re.findall(r'\babc', s)
print(m)
['abc']
018、 \B 匹配非单词边界
import re
s = 'kabccccccd'
m = re.findall(r'\Babc', s)
print(m)
['abc']
019、 | 分组匹配, 选择元字符
import re
s = 'hello haha'
m = re.findall(r'hello|haha', s)
print(m)
['hello', 'haha']
020、() 将括号中字符作为一个分组
贪婪模式 尽可能多的去匹配内容
import re
s = 'hellohello aaaccc123bbb'
m = re.findall(r'hello.*', s)
print(m)
['hellohello aaaccc123bbb']
非贪婪模式 尽可能少的去匹配内容
import re
s = 'hellohello aaaccc123bbb'
m = re.findall(r'hello.*?', s)
print(m)
['hello', 'hello']