王振2020-5-22笔记

### #### 正则表达式   匹配单个字符
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=组名) 引用之前组的名字,把该组名匹配到的内容放到当前位置

"""



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值