正则表达式 re
用于处理 内容比较多、比较复杂的字符串 的一种工具
在表达式中,定义一些规则 ,在大的字符串当中,来筛选出符合规则的子字符串
方法
match()
尝试从字符串的起始位置匹配一个模式,匹配成功则返回的是一个匹配对象(这个对象包含了我们匹配的信息),如果不是起始位置匹配成功的话,match()返回的是空
search()
扫描整个字符串,匹配成功则返回的是一个匹配对象(这个对象包含了我们匹配的信息)
注意:search也只能匹配到一个,找到符合规则的就返回,不会一直往后找
findall()
字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表
sub()
类似于replace的替换方法re.sub(正则表达式、替换成什么、要替换的字符串)
split()
切割,跟字符串split,比字符串更加的灵活
[] 表示一个字符的位
贪婪和非贪婪模式
正则默认都是用贪婪模式去匹配数据的,就是尽可能多的匹配符合要求的数据
非贪婪模式下,始终找最短匹配
###### 位数 []里面的规则 匹配的位数
* 用于将前面的模式匹配0次或多次(默认是贪婪模式---> 尽可能多的匹配字符串)
+ 用于将前面的模式匹配1次或多次(默认是贪婪模式)
? 用于将前面的模式匹配0次或1次(默认是贪婪模式)
{m} 用于将前面的模式匹配 m次(默认是贪婪模式)
{m,} 用于将前面的模式匹配 m次或更多次(默认是贪婪模式)
{m,n} 用于将前面的模式匹配 m次到 n次 即最小匹配 m次,最大匹配 n次。 (默认是贪婪模式)
加上问号就是非贪婪模式:
*?
+?
??
{m,}? m次
{m,n}? m次
#### 判断开头和结尾
^ 用于匹配字符串的开头,match 自动使用这种方法
$ 于匹配字符串的末尾,(如果末尾有换行符 \n,就匹配\n前面的字符),即行尾
#### 预定义字符
"." 用于匹配除换行符(\n)之外的所有字符
\w word 匹配任意数字、字母和下划线
\b boundary 匹配一个单词边界,也就是指单词和空格间的位置。
\d digit 匹配任意的数字
\s space 匹配任意的空白字符 相对于 \t \n \r
\\ 表示匹配一个 \
\W 非 \w
\B
\D
\S
# 分组 ---> 在 规则中 使用 () 来表示一个分组
groups() ----> 所有的组 也可以表示成group(0)
group(1) 第一个分组
"""
练习:
import re
msg1 = "q1werty2uiopa3sdfgh4jklz" # 筛选出 字符串中 的 字母+数字+字母
result = re.findall("[a-z][0-9][a-z]", msg1)
print(result)
msg2 = "q1WertY2uiopA3Sdfgh4jklz" # 筛选出 字符串中 的 字母+数字+字母
result1 = re.findall("[a-zA-Z][0-9][a-zA-Z]", msg2)
print(result1)
# 需求 验证一个 QQ号
# 全是数字,不能以0开头, 5-11位
qq = "12345678901"
result2 = re.search("^[1-9][0-9]{4,10}$", qq)
print(result2)
# 需求:验证一个字符串 是否符合 由数字或字母组成,但是不能以数字开头,而且 长度必须 在6位以上
username = "Admin_123"
result = re.match(r"^[a-zA-Z_]\w{5,}$", username)
print(result)
# 需求 提取出 所在的 xx.py 的文件名
msg = "aa.py a*.py ab.txt bb.py cc.png ddddd.py apyb.txt a**.py"
result = re.findall(r"\w+[*]*\.py\b", msg)
print(result)
# 需求: 匹配一个字符串 是否是 手机号
# 11位 第一位 1 第二位 356789 第3位往后 [0-9] 或 \d
phone_num = "16612345678"
result = re.match("^[1][356789]\d{9}$", phone_num)
print(result)
# |
# 匹配数字 0-100
# 0 1 10 11 99 100 01
num = "100"
result = re.match("^[1-9]?[0-9]?$|100$", num)
print(result)
# 验证邮箱 135796@qq.com karl_go@yeah.net
# 假设 @前面的字符(字母 数字 下划线) 有5-20位
email = 'karl_go@126.com'
#
result = re.match(r"(\w{5,20})@(qq|126|163|yeah)\.(net|cn|com)$", email)
print(result)
# 分组
print(result.groups()) # 显示所有的组的内容
print(result.group(0)) # .group(0) 表示符合规则的整个字符串
print(result.group(1)) # 显示第一组的内容
print(result.group(2))
print(result.group(3))
# 座机号码 022-12345678 0311-1234567 400-1111111
phone_num = "022-12345678"
result = re.match(r"(\d{3,4})-(\d{7,8})$", phone_num)
print(result)
print(result.group(1), result.group(2))
# 提取 html标签 里面的内容
html1 = "<html>hello</html>"
result = re.match(r"<(\w+)>(.+)</\1>$", html1)
print(result)
print(result.group(1))
# 多个标签---> 提取标签名 以及 标签里面的内容
html2 = "<html><h1>hello</h1></html>"
result = re.match(r"<(\w+)><(\w+)>(.+)</\2></\1>", html2)
print(result.group(1))
print(result.group(2))
print(result.group(3))
result = re.match(r"<(?P<n1>\w+)><(?P<n2>\w+)>(.+)</(?P=n2)></(?P=n1)>", html2)
print(result.groups())
# 其他的函数 sub 将 数字 样式的 字符串 进行替换
msg = "java:90,Python:70,C:80"
new_str = re.sub(r"\d+", "100", msg)
print(new_str)
# split()
result = re.split(r"[:,]",msg)
print(result)