正则表达式
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。re模块使 Python 语言拥有全部的正则表达式功能。
一个正则表达式的匹配工具:regex101: build, test, and debug regex
s = "C:\\a\\b\\c"
print(s)
# 正则表达式中遇见 \ 为转义字符,自动转义
# 若在前面加 r 说明是原生字符串,不转义
s1 = r"C:\\a\\b\\c"
print(s1)
re.match函数
re.match 是从字符串的起始位置匹配一个模式,匹配不成功就返回None。
语法格式:re.match(pattern, string, flags=0)
参数:
pattern 需要匹配的正则表达式
string 匹配的字符串
flags 标志位,用于控制正则表达式的匹配方式,
如:是否区分大小写,多行匹配等
若匹配到了数据,就可以使用group(num) 或 groups() 来提取数据了。
group(num=0) 匹配整个字符串,可以设置参数
groups() 返回一个元组,包含所有小组字符串的元组
import re
# match从开始位置匹配
ret = re.match('hqyj', "hqyj world hqyj")
print(ret.group())
re.search函数
re.search 扫描整个字符串并返回第一个成功匹配的字符串。
import re
s1 = 'hqyj world hqyj'
s2 = 'hello hqyj world hqyj hahaha'
# search扫描整个字符串,返回第一个匹配的结果
set = re.search('hqyj', s2)
print(set, set.group())
re.findall函数
re.findall 匹配整个字符串,返回string中所有与pattern相匹配的全部子串,返回形式为列表
import re
s1 = 'hqyj world hqyj'
s2 = 'hello hqyj world hqyj hahaha'
# findall 扫描整个字符串,返回所有匹配的结果
fet = re.findall('hqyj', s2)
print(fet)
- re.match 从首字母匹配,如果字符串开始不符合正则表达式,则匹配失败,函数返回 None。
- re.search 匹配整个字符串,直到找到一个对应匹配【若有多个,也只返回第一个】。
- re.findall 返回匹配到的所有子串。
正则表达式修饰符 - 可选标志
import re
s = 'Good good study, Day day up'
ret = re.findall('good', s, re.I)
print(ret)
正则表达式模式
模式字符串使用特殊的语法来表示一个正则表达式。
- 字母和数字表示他们自身。
- 一个正则表达式模式中的字母和数字匹配同样的字符串。
- 多数字母和数字前加一个反斜杠时会拥有不同的含义。
- 标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。
- 反斜杠本身需要使用反斜杠转义。
由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们
import re
s = '__ 888 hqyj 666 &&&&&'
ret1 = re.findall('.', s)
ret2 = re.findall('[h6]', s)
ret3 = re.findall(r'\d', s)
ret4 = re.findall(r'\D', s)
ret5 = re.findall(r'\w', s)
ret6 = re.findall(r'\W', s)
print(ret6)
import re
#匹配出一个字符串第一个字母为大写字符,后面都是小写字母并且这些小写字母可有可无
def fun1(s:str):
ret = re.match(r'[A-Z][a-z]*', s)
if ret:
print(ret.group())
else:
print("匹配不成功")
s = 'Abcd777'
fun1(s)
#匹配变量名是否有效
def fun2(name:str):
ret = re.match(r'[A-Za-z_]+[\w]*', name)
if ret:
print(ret.group())
else:
print("变量命名不合法")
name = '_a '
fun2(name)
#匹配出6位密码,可以是大小写英文字母、数字、下划线
#匹配出,8到20位的密码,可以是大小写英文字母、数字、下划线
def fun3(pwd:str):
ret = re.match(r'\w{8,20}', pwd)
if ret:
print(ret.group())
else:
print("密码不正确")
fun3('12345')
import re
#匹配163.com的邮箱地址
# 以^确定开头
# 通过$来确定末尾
myemail = 'hqyj_sunwy@163.com'
ret = re.match(r'^\w{4,20}@163\.com$', myemail)
print(ret.group())
import re
#匹配出163、126、qq邮箱
myemail = '2042856895@qq.com'
ret = re.match(r'^\w{4,20}@(163|126|qq)\.com$', myemail)
print(ret.group())
#匹配出<html><h1>www.bawei.com</h1></html>
ret = re.match(r"<(\w*)><(\w*)>.*</\2></\1>", "<html><h1>www.hqyj.com</h1></html>")
print(ret.group())
#匹配出<html><h1>www.bawei.com</h1></html>
ret = re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.hqyj.com</h1></html>")
print(ret.group())
注意贪婪和非贪婪
贪婪是尝试匹配尽可能多的字符。
非贪婪是尝试匹配尽可能少的字符。
解决方式:非贪婪操作符”?”,用在"*","+","?"的后面,要求正则匹配的越少越好。
import re
s = 'abbcdef123456'
ret = re.match(r'\w+', s)
print(ret.group())
# 输出结果:abbcdef123456
ret = re.match(r'\w+?', s)
print(ret.group())
# 输出结果:a