python中,如何使用正则表达式?
(1)原生模块: re模块(与python解释器直接绑定的,不需要另行下载pip)
(2)被提取的数据文本,他们都是string字符串类型
作用:
1) 爬虫- 提取数据,只是辅助作用,jsonpath,xpath。
2) 后端- 路由的设置url,检验用户的,规范匹配。
注意:正则表达式不属于python,是一个跨语言的。
import re
re.match(pattern, string, flags=0)
说明:第一个参数:正则表达式,第二个参数:提取的字符串, 最终返回匹配的结果对象
re.match(r'正则表达式(字符串)','要提取的字符串')
result=re.match(r'hello','hello,mike')
print(result)
print(result.group()) # group()方法用来提取匹配成功之后的部分
#如果匹配成功,那么就返回 : <re.Match object; span=(0, 5), match='hello'>
# result=re.match(r'hello3','hello,mike')
# print(result)
#如果匹配不成功,那么就返回 : None
(一) 匹配单个字符
#(1) \d 只能是任意一位数字
#只能匹配1-5的数字哦!,其他就不符合要求!
# result=re.match(r'熊出没\d','熊出没6')
# print(result)
# print(result.group())
#(2) [] 匹配[]中列举的单个字符
# result=re.match(r'熊出没[1-5]','熊出没6')
# print(result)
# print(result.group())
#大写 ABCDE [A-E]
#小写 abcde [a-e]
# result=re.match(r'熊出没[a-e]','熊出没e')
# print(result)
# print(result.group())
# 注册一个用户名 大写字母 小写字母 数字 下划线
#[A-Za-z0-9_] 等同于> \w
# result=re.match(r'熊出没\w','熊出没A_')
# print(result)
# print(result.group())
# \s 匹配空白, 即 空格 和 tab 键
# result=re.match(r'熊出没\w\s','熊出没V ')
# print(result)
# print(result.group())
# (重点) . 匹配任意1个字符(除了\n之外换行) .*?
result=re.match(r'熊出没.','熊出没V $')
print(result)
print(result.group())
(二) 匹配多个字符
#熊出没中的数字匹配1位或2位数字
# result=re.match(r'熊出没\d{1,2}','熊出没15')
# print(result)
# print(result.group())
#手机号码11位数字
# result=re.match(r'\d{11}','1389632456') #10位数字,匹配不成功
# result=re.match(r'\d{11}','138963245612') #12位数字,匹配成功,有问题? 没有判断结尾,,,提前匹配结束...
# print(result)
# print(result.group())
'''
重点:
{1,9} 代表他前面那个字符可以出现1-9位 数量
{11} 代表他前面那个字符可以出现11位 数量
'''
#电话号码=>区号-座机号(注意:-可有可无)使用?
#比如: 010-98765432 or 01098765432
# result=re.match(r'010-?\d{8}','010-98765432')
# result=re.match(r'010-?\d{8}','01098765432')
# result=re.match(r'\d{3,4}-?\d{8}','0571-98765432')
# print(result)
# print(result.group())
#如果是多个--,那么就使用*
# result=re.match(r'\d{3,4}-*\d{8}','0571--98765432')
# print(result)
# print(result.group())
#.无法匹配换行符哦
hello='''hello,mike
hello,john
hello,chinese
'''
# result = re.match(r'.*',hello)
# .匹配任务字符 *无数次 >>> re.S 这个参数 可以匹配到换行符
result = re.match(r'.*',hello,re.S)
print(result)
print(result.group())
# result=re.match(r'.*','''0571-
# 98765432''',re.S)
# print(result)
# print(result.group())
#如果使用+,那么-至少出现1次哦!
result=re.match(r'\d{3,4}-+\d{8}','057198765432')
print(result)
print(result.group())
# 这些数字必须有,,不确定数量 >>> 以为着没有数字的话, 是需要匹配不成功
# result = re.match(r'www.baidu.com/\d+', 'www.baidu.com/98765432')
(三) 匹配开头结尾
# ^熊,必须以熊字开头哦!
# 没$ 必须以没字开头哦!
# result=re.match(r'^熊出没$','熊出没')
# print(result)
# print(result.group())
#昵称:
# 1.必须是由字母,数字,下划线组成
# 2.不能以数字开头
while True:
name =input('输入昵称:')
#有且至少有一个开头,[a-zA-Z_0-9]可以没有,也可以有多位 * +?
# result = re.match(r'[a-zA-Z_][a-zA-Z_0-9]*',name)
#(2)注意,必须要加上结尾符号哦!$
result = re.match(r'[a-zA-Z_][a-zA-Z_0-9]*$',name)
# print(result)
if result:
print(f'{name} 符合规范的!')
# print(result.group())
else:
print(f'{name} 必须是由字母,数字,下划线组成.不能以数字开头!')
#注意:match默认匹配开头,没有匹配结尾
# 输入昵称:my#a
# my#a 符合规范的!
# my
(三) 匹配分组
案例1:验证QQ邮箱是否符合?123456@qq.com 1)数字必须在5到12位 2)q大小不区分
import re
while True:
email =input('please input the email:')
# 此时的.代表不是点本身,而是单个字符的匹配
result =re.match(r'\d{5,12}@[qQ]{2}.com$',email)
# 此时的\.代表是点本身
# result =re.match(r'\d{5,12}@[qQ]{2}\.com$',email)
if result:
print(f'{email}正确!显示:{result.group()}')
else :
print(f'{email}有误!')
说明:
. * ? [] \ 等等这些 在正则表达式里面有特殊作用的字符, 注意: 仅仅代表自己本身, 前面加上一个反斜杠\; 那么就使用\* ==>* \.==>.
案例2:除了验证QQ邮箱还可以网易邮箱呢? 选其中一个哦
(1) [qQ]{2}|163 >> 选其中一个
(2) 范围的描述 >>进行分组() ([qQ]{2}|163),选取的范围
while True:
email =input('please input the email:')
# 此时的.代表不是点本身,而是单个字符的匹配
result =re.match(r'\w{4,12}@([qQ]{2}|163)\.com$',email)
if result:
# print(f'{email}正确!显示:{result.group()}') #group()没有参数时,提取满足正则表达式所有的数据
print(f'{email}正确!显示:{result.group(1)}') #group()有参数时, 提取()第一个分组的数据
else :
print(f'{email}有误!')
说明:提取关键字 QQ or 163 正则表达式()>分组,可以提取特殊数据