python进阶之路
Day13
hello world!今日是python学习的第十三天,我将会在下面文章对基础语法进行一些介绍,主要为正则语法的补充学习、re模块的学习、忽略大小写与多行匹配的方法、编程思想、类与对象的简单介绍等。
1 正则语法
from re import fullmatch,search,findall
1.1 贪婪与非贪婪
当匹配次数不确定的时候,分为贪婪与非贪婪两种;
贪婪:再能匹配成功的前提下,次数尽可能多的进行匹配(越多越好),默认情况下都是贪婪。
非贪婪:再能匹配成功的前提下,次数尽可能少的匹配(越少越好)。在不确定的匹配次数加问号就是非贪婪的。
(*?、+?、??、{M,N}?、{M,}?、{,N}?)
fullmatch中贪婪与非贪婪无区别
re_str = '.*abc'
print(fullmatch(re_str,'dsfsddsfweeabc'))
search的用法
re_str = r'\d\d'
print(search(re_str,'asdeas56sdsdwd5'))#字符串中有满足条件的就行。
print(search(r'.*abc','你好dwzabc==+sabcd'))
print(findall(r'.*abc',''))
1.2 检测符号
检测类符号只做字符的检测不会进行匹配
1) \b - 检测是否是单词边界(单词边界就是任何可以区分出两个不同单词的符号,比如:空白、标点、字符串开头和字符串结尾)
re_str = r'abc\b123'
print(fullmatch(re_str,'abc 123')) # 没有正则能够匹配成功
re_str = r'abc,\b123'
print(fullmatch(re_str,'abc,123'))
re_str = r'\b\d{3}\b'
print(findall(re_str,'s215sa1d,654,as1ds5daw5dds15dsad5135'))
2) ^ - 检测是否是字符串开头
re_str = r'^\d{3}'
print(findall(re_str,'123dsfdd,568dfdsf,12ddfsd.456ddfd'))
3) $ - 检测是否是字符串结尾
re_str = r'\d{3}$'
print(findall(re_str,'123dsfdd,568dfdsf,12ddfsd.456ddfd456'))
1.3 分支 - | (或者)
正则表达式1|正则表达式2|正则表达式3.。。。 - 让字符串先和第一个正则进行匹配,如果失败在和第二个正则二进行匹配。
编一个正则,能够匹配三个数字或者3个字母
re_str = r'\d{3}|[a-zA-Z]{3}'
print(fullmatch(re_str,'123'))
print(fullmatch(re_str,'scz'))
练习:写一个正则,能匹配的字符串是:abc后面是三个数字或者两个大写字母
re_str = r'abc\d{3}|abc[A-Z]{2}'
print(fullmatch(re_str,'abc456'))
print(fullmatch(re_str,'abcAS'))
print(fullmatch(re_str,'abc4A'))
print(fullmatch(re_str,'abcjk'))
1.4 分组 - ()
1) 把正则的部分内容看成一个整体,进行操作
2) 可以整体中支取部分
re_str = r'abc(\d{3}|[A-Z]{2})'
练习:写一个正则能够匹配一个字符串是两个数字三个字母这种结构不断重复的字符串
# 12asd45zxc89dsv54eff98
re_str = r'(\d{2}[a-zA-Z]{3})+'
print(fullmatch(re_str,'12asd45zxc89dsv54eff'))
3) 分组和\N配合使用来控制匹配内容重复(内外分组外是第一分组)
re_str = r'abc(\d{2})=\1{3}'
print(fullmatch(re_str,'abc89=898989'))
print(findall(r'ae(\d{2})','asda78zcsae56dscsde'))
2 re 模块
import re
2.1 compile(正则表达式) - 编译正则表达式创建一个正则表达式对象
re_obj = re.compile(r'\d{3}')
re.fullmatch(正则表达式,字符串)
# 正则对象.fullmatch(字符串)
print(re_obj.fullmatch('799'))
2.2 匹配
1) fullmatch(正则表达式,字符串) - 完全匹配,查看整个字符串是否和正则表达式匹配;匹配成功返回匹配对象,失败返回None
2) match(正则表达式,字符串) - 匹配字符串开头,查看字符串开头是否和正则表达式匹配;匹配成功返回匹配对象,失败返回None
2.3 匹配对象(match对象)
re_str = r'(\d{3})([a-z]{2})'
result = re.match(re_str,"123asdsa大苏打")
print(result)
a. 获取匹配到的字符串
匹配对象.group() - 获取整个正则匹配到的结果
匹配对象.group(N) - 获取正则中第N个分组匹配到的结果(必须有分组)
print(result.group())
print(result.group(1))
print(result.group(2))
b. 获取匹配结果匹配到的字符串在原字符串中的位置
print(result.span())
print(result.span(1))
c. 获取原字符串
print(result.string)
2.4 查找
1) search(正则表达式,字符串) - 在字符串中获取第一个满足正则表达式的子串,如果找到了返回匹配对象,找不到返回None。
print(re.search(r’\d{3}’,‘sadadw上单456ds789fd’))
2) findall(正则表达式,字符串) - 获取字符串中所有满足正则表达式的子串。返回一个列表,列表中的元素就是返回中的子串。
a. 如果正则中没有分组 - 列表中的元素就是整个正则匹配到的子串
re_str = r'\d{3}[A-Z]{2}'
str1 = 'nihao是456SA=csdssdsd789SDsdsd471RUxdd'
result = re.findall(re_str,str1)
print(result)
b. 正则中有一个分组 - 匹配成功后将分组匹配到的子串作为列表元素。
re_str = r'(\d{3})[A-Z]{2}'
str1 = 'nihao是456SA=csdssdsd789SDsdsd471RUxdd'
result = re.findall(re_str,str1)
print(result)
c. 正则中有多个分组 - 匹配成功后每个匹配结果是一个元组,元组中的元素是每个分组匹配到的内容,将元组作为列表的元素。
re_str = r'(\d{2})-([A-Z]{2})'
str1 = 'nihao是45-SA=csdssdsd789-SDsdsd471RUxdd'
result = re.findall(re_str,str1)
print(result)
3) finditer(正则表达式,字符串) - 获取字符串中所有满足正则表达式的子串,返回一个迭代器,迭代器中的元素是匹配对象,
re_str = r'(\d{2})-([A-Z]{2})'
str1 = 'nihao是45-SA=csdssdsd789-SDsdsd471RUxdd'
result = re.finditer(re_str,str1)
print(list(result))
4) 字符串替换
sub(正则表达式,新字符串,原字符串) - 将原字符串中所有满足正则表达式的子串全部替换成新字符串。
```python
将字符串中所有的数字字符都替换成‘+’
‘按实78是asd45倒萨倒萨s啊实打实sds’ -> ‘按实++是asd++倒萨倒萨s啊实打实sds’
str1 = ‘按实78是asd45倒萨倒萨s啊实打实sds’
result = re.sub(r’\d’,’+’,str1)
print(result)
```
练习:替换语句中的不良用语
sentence = '你丫是傻叉吗? 我操你大爷的. Fuck you.'
re_str = r'傻叉|操|Fuck'
result = re.sub(re_str,'*',sentence)
print(result)
5) 字符串切割
split(正则表达式,字符串) - 将字符串中满足正则表达式的子串作为切割点对字符串进行切割
poem = '床前明月光,疑是地上霜,举头望明月,低头思故乡。'
result = re.split(r'[,。]',poem)
print(result)
from re import fullmatch
3 忽略大小写与单行匹配
3.1 忽略大小写:在正则表达式的最前面加(?i)
re_str = r'(?i)abc'
print(fullmatch(re_str,'abc'))
print(fullmatch(re_str,'Abc'))
3.2 单行匹配:. 能够匹配换行符的匹配模式,在正则的最前面加(?s)
默认是多行匹配: . 不能匹配换行符
re_str = r'a.+b'
print(fullmatch(re_str,'a+\nb'))
re_str = r'(?s)a.+b'
print(fullmatch(re_str,'a+\nb'))
3.3 符号的转义
在正则中有特殊功能的符号前面加\,可以使功能消失,使其表示符号本身的意义。
re_str = r'\d\d.\d\d'
print(fullmatch(re_str,'23.56'))
print(fullmatch(re_str,'23+56'))
re_str = r'\d\d\.\d\d'
print(fullmatch(re_str,'23+56'))
print(fullmatch(re_str,'23.56'))
re_str = r'\(\d\d\)'
print(fullmatch(re_str,'56'))
print(fullmatch(re_str,'(56)'))
独立存在有特殊功能的符号,在[]中功能会自动消失
re_str = r'[.=a]123'
print(fullmatch(re_str,'.123'))
print(fullmatch(re_str,'=123'))
re_str = r'[\\d]123'
print(fullmatch(re_str,'\\123'))
4 编程思想
面向过程编程(穷人) - 遇到问题首先想到的是用什么样的逻辑和语法能够实现这个功能(逻辑,语法)
函数式编程(小资) - 遇到问题首先想到的是有没有一个已经存在的函数能够完成这个功能,这个函数如果没有就定义一个能够实现这个功能的函数。(函数)
面向对象编程(富豪) - 遇到问题首相想到的是有没有一个对象他有这个功能,没有就去创建这个对象。(类和对象)
# 面向过程编程
a = 10
b = 20
print(a+b)
# 函数式编程
from math import factorial
print(factorial(10))
def sum1(a,b):
return a+b
# 面向对象编程
sum1(10,20)
class Math:
@staticmethod
def factorial(n):
sum1 = 1
for x in range(1,n+1):
sum1 *= x
return sum1
@staticmethod
def abs(num):
if num >= 0:
returnnum
return -num
5 类和对象
5.1 什么是类什么是对象
类就是拥有相同功能和相同属性的对象的集合;(某一类事物的统称,是抽象的概念)
对象就是类的实例(类具体的表现)
如果人是类,余婷就是对象;我就是对象
如果车是类,每一辆车就是对象,楼下的那辆红色骚气的跑车就是对象。
5.2 定义类(目的是表述清楚你是哪些相同功能,属性的统称)
语法:
class 类名:
类的说明文档
类的内容(方法与属性)
说明:
1 class - 关键字;固定写法
2 类名 - 程序员自己命名;
要求:a.是标识符 b.不是关键字
规范:a. 采用驼峰式命名,并且首字母大写
b. 见名知义(看到名字大概知道这个类是哪一种事物的统称)
c. 不能使用系统的函数名、类名、模块名
3.类的说明文档 - 和函数说明文档的要求一样
4.类的内容 - 类的内容中主要包含类的方法(对象方法、类方法和静态方法)和属性(类属性、对象属性)
方法:方法就是定义在类中的函数
驼峰式命名:学生的名字 -> studentName
类名:学生 -> Student
类名:管理系统 -> ManagerSystem
class Housekeeping:
"""
家政类:拥有洗衣服、做饭、打扫的功能
"""
def wash_the_clothes(self):
print('洗衣服')
def cooking(self):
self = h
print(self)
print('做饭')
def clean(self):
print('打扫')
5.3 定义对象(创建对象)
语法:
类()
# h就是Housekeeping的对象
h = Housekeeping()
h.cooking()
print(h)