day23-re模块
2020-08-06 本文已影响0人
天行_b6d0
一、re模块的几个函数
1、re.match()
- re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
- 函数语法:
re.match(pattern, string, flags=0)
(正则表达式,字符串,标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。) - 匹配成功re.match方法返回一个匹配的对象,否则返回None。
import re
print(re.match('www', 'www.runoob.com').span()) # 在起始位置匹配
print(re.match('com', 'www.runoob.com')) # 不在起始位置匹配
2、re.search方法
- re.search 扫描整个字符串并返回第一个成功的匹配。
- 函数语法:
re.search(pattern, string, flags=0)
import re
print(re.search('www', 'www.runoob.com').span()) # 在起始位置匹配
print(re.search('com', 'www.runoob.com').span()) # 不在起始位置匹配
3、findall方法
-
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
-
注意: match 和 search 是匹配一次 findall 匹配所有。
-
语法格式为:
findall(string[, pos[, endpos]])
参数:
- string : 待匹配的字符串。
- pos : 可选参数,指定字符串的起始位置,默认为 0。
- endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度。
二、正则表达式
正则表达式:由一系列特殊字符拼接而成的表达式/规则,该表达式用于从一个大字符串中匹配出符合规则的子字符串
1、\w 匹配数字、字母、下划线
import re
print(re.findall('\w',"1b2 hhh c_1 ahvfbfioi"))
2、\W 非数字、字母、下划线
import re
print(re.findall('\W',"1b2 hhh c_1 @ahvfbfioi"))
3、\s匹配 任意空白字符,{\t,\n,\r,\f}
import re
print(re.findall('\s',"1b2 h\nhh c_1\tahvfbfioi"))
4、\S 非空白字符
import re
print(re.findall('\S',"1b2 h\nhh c_1\tahvfbfioi"))
5、\d 匹配任意数字
import re
print(re.findall('\d',"21b h\nhh c_1\tahvfbfioi"))
6、\D 匹配任意非数字
import re
print(re.findall('\D',"1b2 h\nhh c_1\tahvfbfioi"))
7、 .用来匹配任意一个字符
import re
print(re.findall("a.b","a1b a2b aab aaaaaaab a+b a-b a b a c"))
print(re.findall("a.b","a1b a2b aab aaaaaaab a\tb a-b a\nb ac",re.DOTALL)) # 加上可以匹配换行符
8、 ^匹配字符串开头
import re
print(re.findall("^a.b"," a1b a2b aab aaaaaaab a+b a-b a b a c")) # 开头匹配不到就不匹配了
9、$ 匹配字符串末尾
import re
print(re.findall("a.b$"," a1b a2b aab aaaaaaab a+b a-b a b a c")) # 从尾部开始匹配不到就不匹配了
10、 [ ]匹配中括号里面范围内的字符
import re
print(re.findall("a[^a-z-]b"," a1b aZb aab aaaaaaab a+b a-b a b a c")) # 加上^是取反
11、?左边的字符出现0或1次
import re
print(re.findall("ab?"," a1b ab abbb a2b aab aaaaaaab a+b a-b a b a c"))
12、 * 左边字符出现0或无数次
import re
print(re.findall("a*b"," a1b a2b aab aaaaaaab a+b a-b a b a c"))
13、+左边字符出现一次或无数次
import re
print(re.findall("a+b"," a1b a2b aab aaaaaaab a+b a-b a b a c"))
14、{n,m}左边那个字符出现n次到m次
import re
print(re.findall("a{0,8}b"," a1b a2b aab aaaaaaab a+b a-b"))
15、 ():分组 把括号里的当成一个整体进行匹配,每组取一个
import re
print(re.findall('ab+','ababab123')) # ['ab', 'ab', 'ab']
print(re.findall('(ab)+123','ababab123')) # ['ab'],匹配到末尾的ab123中的ab
16、取消分组
import re
print(re.findall('(?:ab)+123','ababab123')) # findall的结果不是匹配的全部内容,而是组内的内容,?:可以让结果为匹配的全部内容
17、 ?!pattern,表示在没有配到pattern的字符串的前提下,再进行后续的正则表达式匹配,后续匹配仍然从被匹配字符串的头开始
匹配密码,密码必须是由6位数字与字母组成,并且不能是纯数字也不能是纯字母
print(re.search("(?!^[0-9]+$)(?!^[a-zA-Z]+$)^[0-9A-Za-z]{6}$","123asf").group()) # 123asf
上述正则的意思为:在匹配(?!^[0-9]+$)以及(?!^[a-zA-Z]+$)
过后,如果字符串成功后在从头去匹配(?!^[a-zA-Z]+$)
,最终匹配完。
18、?=pattern,表示在配到pattern的字符串的前提下,再进行后续的正则表达式匹配,后续匹配仍然从被匹配字符串的头开始
匹配密码,密码强度:强,必须包含大写,小写和数字,和特殊字符(!,@,#,%,&)
,且大于6位
while True:
pwd = input("please your password: ").strip() # 比如输入:Aa3@adf123
pwd_pattern= re.compile("(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#%&])^([a-zA-Z0-9!@#%&]){6,}$")
if pwd_pattern.search(pwd) is None:
print("密码强度不够")
else:
break
上述正则表达式的意思:
- 首先是
(?=.*[A-Z])
匹配,.*表示密码中可以包含多个字符,[A-Z]
代表密码中需要包含至少一个大写字母,注意一定不要去掉.*
写成(?=[A-Z])
,那样表示密码只能由一个字符组成,该字符是大写字母 - 其次是
(?=.*[a-z])
匹配,同上,确保密码中必须至少有一个小写字母 - 然后是
(?=.*[0-9])
匹配,同上,确保密码中必须至少有一个数字 - 然后是
(?=.*[!@#%&])
匹配,同上,,确保密码中必须至少有一个特殊符号!@#%&
- 最后是
^([a-zA-Z0-9!@#%&]){6,}$
,确保密码是由[a-zA-Z0-9!@#%&]
字符构成,至少有6位
19、?: 是非获取匹配,匹配冒号后的内容但不获取匹配结果,不进行存储供以后使用。
匹配email:
print(re.findall("(?:[a-zA-Z0-9]+)@(?:[0-9a-zA-Z]+).com","18611323113@163.com xxx@qq.com"))
正则表达式符号意义.png
更具体的:http://blog.csdn.net/yufenghyc/article/details/51078107
手动测试:http://c.runoob.com/front-end/854
二、面向对象编程
面向过程编程
核心是过程二字,过程是解决问题的步骤,即先干啥再干啥后干啥。
基于该思想写程序就是在设计一条条的流水线
- 优点:复杂的问题流程化、进而简单化
- 缺点:扩展性差
面向对象编程
核心是对象二字,对象是一个用来盛放数据与功能的容器
基于该思想写程序就是在整合程序
- 优点:可扩展性强
- 缺点:编程的复杂度高