### #### 正则表达式 匹配单个字符
import re
lst = re.findall(正则表达式,要匹配的字符串)
返回列表,列表里面存储的都是按照正则表达式匹配到的内容
# ### 预定义字符集
# \d 匹配数字 从左到右依次调取判定
re.findall("\d","afjkdsfj123dfj")
lst = re.findall("\d","afjkdsfj123dfj")
print(lst)
# \D 匹配非数字
lst = re.findall("\D","afjkdsfj123dfj")
print(lst)
# \w 匹配字母 数字 下划线 (正则函数中,支持中文的匹配)
lst = re.findall("\w","afjkds_fj123d王振fj")
print(lst)
# \W 匹配非字母 非数字 非下划线
lst = re.findall("\W","afjkds_fj123d王振fj")
print(lst)
# \s 匹配任意的空白符 空白符大概有\n \t \r " " 凡是看不见的都是空白符
lst = re.findall("\s","afjkds_fj123d王振fj")
print(lst)
# \S 匹配任意的非空白符
lst = re.findall("\S","afjkds_fj123d王振fj")
print(lst)
# \n 匹配一个换行符 用三引号进行换行
strvar = """
王振是 帅 哥
"""
lst = re.findall(r"\n",strvar)
print(lst)
lst = re.findall(r"\t",strvar)
print(lst)
### #### 字符组[] 必须匹配中括号里列举的字符
lst = re.findall("[abc]","afjdbji")
print(lst) # 结果是['a','b']
lst = re.findall('a[abc]b',"aab abb acb adb")
print(lst) # 结果是 aab abb acb
<-------------------------------------------------->
lst = re.findall('a[01234]b',"a1b a2b a3b adb")
优化后
lst = re.findall('a[0-4]b',"a1b a2b a3b adb")
<-------------------------------------------------->
lst = re.findall('a[abcdef]b',"a1b a2b a3b adb")
优化后
lst = re.findall('a[a-f]b',"a1b a2b a3b adb")
<-------------------------------------------------->
lst = re.findall('a[ABCDEF]b',"a1b a2b a3b adb")
优化后
lst = re.findall('a[A-F]b',"a1b a2b a3b adb")
<-------------------------------------------------->
lst = re.findall('a[0-9a-zA-Z]b',"a-b aab aAb aWb aqba1b") #结果是aab aAb aWb aqb a1b
相当于 0-9 a-z A-Z
<-------------------------------------------------->
特别注意
##在字符组中 ^ 代表是除了 ,也就是除了中括号里面的我都要
'a[^-+*/]b'
如果想要,需要在转义字符前面加\ 让他们失去转义
<===================================================================================>
#### ### 正则表达式 多个字符的匹配
###量词练习
1 ? 匹配0个或者1个a '''
print(re.findall('a?b','abbzab abb aab')) # ab b ab ab b ab
2 + 匹配1个或者多个a '''
print(re.findall('a+b','b ab aaaaaab abb')) # ab aaaaaab ab
3 * 匹配0个或者多个a '''
print(re.findall('a*b','b ab aaaaaab abbbbbbb')) # b ab aaaaaab ab b b b b b b
4 {m,n} 匹配m个至n个a '''
# (1) 1 <= x <= 3
print(re.findall('a{1,3}b','aaab ab aab abbb aaz aabb')) # aaab ab aab ab aab
# (2) 前面修饰的a , 必须是2个字符
print(re.findall('a{2}b','aaab ab aab abbb aaz aabb')) # aab aab aab
# (3) 前面修饰的a , 至少是2个字符
print(re.findall('a{2,}b','aaab ab aab abbb aaz aabb')) # aaab aab aab
### 贪婪模式 与 非贪婪模式
贪婪模式 就是默认向更多次匹配 底层用的是回溯算法
非贪婪模式 默认向更少次匹配 用一个?来修饰的都是非贪婪模式
回溯算法:从左到右进行匹配,一直到最后,直到最后再也找不到了,回头,寻找最后一个
.表示匹配任意字符,除了换行\n
非贪婪模式 格式是(量词.?) 多加个?号就是非贪婪模式
#### 边界符 \b ^(必须以..开头) $(必须以..结尾)
边界符 卡单词 word
卡左边\bw
卡右边d\b
^ 必须以..开头
$ 必须以..结尾
如果加了^号,必须把字符串看成整体
<===============================================================================>
###正则表达式的 匹配分组
?:不显示括号里面的内容
()显示括号里面的内容
|代表或 a|b a或b 匹配a或者匹配b
为了避免优先匹配前面的字符串,导致字符串匹配不完整
把较难的字符串放前面,容易的放后面 abcd|abc
\.让他正则意义失效,简单表达小数点
\d+\.\d+ 匹配小数
\d+\.\d+|\d+ 匹配小数或整数
优化一下
\d+(?:\.\d+)?
优先显示括号里面的内容,为了不让优先显示,加个 ?: 来处理
# 匹配135或者171的手机号
lst = re.findall('(?:135|171)\d{8}',strvar)
print(lst)
lst = re.findall('^(?:135|171)[0-9]{8}$',strvar)
print(lst)
### #### search 函数
"""
findall 把所有匹配到的字符串搜索出来,返回一个列表
缺点是不能把分组内容和匹配内容同时显示出来
search 只要搜到一个结果就返回,返回的是一个对象
可以把分组的内容和匹配的内容同时显示出来
group方法:对象.group() 直接获取匹配到的内容
对象.groups() 直接获取分组里面的内容
search 在匹配不到时,返回的是None,无法使用group
"""
obj = re.search("(www)\.(baidu|oldboy)\.(com)",strvar)
print(obj)
print(obj.group()) 获取实际匹配的内容
print(obj.groups()) 获取分组的内容也就是括号里面的内容
print(obj.group(1))
print(obj.group(2))
print(obj.group(3))
获取各个分组的内容
strvar = "5*6-7/3"
\d(*|/)\d 第一种写法
\d+[*/]\d+ 第二种写法
re.search(r"\d+[*/]\d+",strvar)
print(obj.group())
n1,n2 = strvar1.split("*")
print(int(n1)*int(n2))
<------------------------------------------------------------------------------>
##### 正则表达式,命名分组
import re
当不清楚字符串里有什么内容时候,用.*?代替
.*? 表达任意字符,且是非贪婪模式
lst = re.findall("<(.*?)>(.*?)<(.*?)>",strvar)
print(lst)
#### 反向引用
\1 代表反向引用,将第一个括号匹配的字符串,在\1位置再引用一次
lst = re.findall(r"<(.*?)>(.*?)<(/\1)>",strvar)
print(lst)
re.search(r"(.*?)\d(.*?)\d(.*?)\1\2",strvar)
print(obj.group())
### 2 命名分组
"""
?P<组名>正则表达式 给小组命名
(?P=组名) 引用之前组的名字,把该组名匹配到的内容放到当前位置
"""
王振2020-5-22笔记
最新推荐文章于 2020-05-29 20:43:41 发布