Python基础——模块和正则表达式

模块

1.模块就是程序

模块是更高级的封装。先回顾一下以前学过的封装:
(1)容器(列表、元组、字符串、字典等),是对数据的封装;
(2)函数,是对语句的封装;
(3)类,是对方法和属性的封装,也就是对函数和数据的封装。
(Python中将不能修改的值称为不可变的,不可变的列表称为“元组”。)

2.命名空间

命名空间表示标识符的可见范围。
在Python中,每个模块都会维护一个独立的命名空间,应该将模块名加上,才能够正常使用模块中的函数。

3.导入模块

( a )import 模块名

def c2f(cel):
    fah=cel*1.8+32
    return fah
def f2c(fah):
    cel=(fah-32)/1.8
    return cel

再写一个文件导入刚才的模块:

import TemperaturnConversion
print("0摄氏度=%.2f华氏度"%TemperaturnConversion.c2f(0))
print("0华氏度=%.2f摄氏度"%TemperaturnConversion.f2c(0))

( b )from 模块名 import 函数名

from TemperaturnConversion import c2f,f2c
print("0摄氏度=%.2f华氏度"% c2f(0))
print("0华氏度=%.2f摄氏度"% f2c(0))

( c )import 模块名 as 新名字

import TemperatureConversion as tc

print("32摄氏度=%2f华氏度"%tc.c2f(32))
print("99华氏度=%2f摄氏度"%tc.f2c(99))

4.模块的主要作用

模块的主要作用:1.封装组织Python的代码;2.实现代码的重用。

def c2f(cel):
    fah=cel*1.8+32
    return fah
def f2c(fah):
    cel=(fah-32)/1.8
    return cel
def test():
    print("测试,0摄氏度=%.2f华氏度"%c2f(0))
    print("测试,0华氏度=%.2f摄氏度"%f2c(0))
if __name__=="__main__":
    test()

5.搜索路径

搜索路径就是一组目录,可以通过sys模块中的path变量显示出来。

6.包

创建一个包的具体操作如下:
(1)创建一个文件夹用于存放相关的模块,文件夹的名字即包的名字。
(2)在文件夹中创建一个__init__.py的模块文件,内容可以为空。
(3)将相关的模块放入文件夹中。
(注意:在第(2)步中,必须在目录下建立一个__init__.py模块,可以是一个空文件,也可以写一些初始代码,这是Python的规定,用来告诉Python将该目录当成一个包来处理。)

正则表达式

1.正则表达式匹配原则

1.正确性,能够正确地匹配出目标字符串;
2.排他性,除了目标字符串之外尽可能少的匹配其他内容;
3.全面性,尽可能考虑到目标字符串的所有情况,不遗漏。

2.常用元字符

(1)点号(.)表示匹配除换行符外的任何字符。

import re
re.findall('张.',"张三")
['张三']

(2)脱字符(^)表示匹配字符串的开始位置,也就是说,只有目标字符串出现在开头才会匹配。

re.findall("^张三","张三你好")
['张三']

(3)美元符号($)表示匹配字符串的结束位置,也就是说,只有目标字符串出现在末尾才会匹配。

re.findall("Python$","你好,Python")
['Python']

3.正则表达式的转义

(1)如果使用正则表达式匹配特殊字符则需要加\表示转义;
(2)在编程语言中,常使用原生字符串书写正则表达式避免多重转义的麻烦。
(在字符串前端使用了 ‘r’ 或 ‘R’ 的字符串叫原生字符串。
原生字符串中的每个字符都表示它本身的含义。)

4.贪婪模式和非贪婪模式

(1)定义:
贪婪模式:默认情况下,匹配重复的元字符总是尽可能多的向后匹配内容。

import re
s="[花千骨],[杉杉来了],[陆贞传奇],[楚乔传]"
re.findall(r"\[.+\]",s)
['[花千骨],[杉杉来了],[陆贞传奇],[楚乔传]']

非贪婪模式(懒惰模式):让匹配重复的元字符尽可能少的向后匹配内容。

re.findall(r"\[.+?\]",s)
['[花千骨]', '[杉杉来了]', '[陆贞传奇]', '[楚乔传]']

(2)贪婪模式转化为非贪婪模式只需要在重复元字符后加" ? "即可。

5.正则表达式分组

(1)定义:在正则表达式中,以()建立正则表达式的内部分组,子组是正则表达式的一部分,可以作为内部整体操作对象。
(2)作用:
a.可以被作为整体操作,改变元字符的操作对象。

re.search(r'(ab)+',"ababababab").group()
'ababababab'

b.可以通过编程语言某些接口获取匹配内容中子组对应的部分

re.search(r"(https|http|ftp|file)://\S+","http://www.baidu.com").group(1)
'http'

(3)捕获组
可以给正则表达式的子组起一个名字,表达该子组的意义。这样有名称的子组即为捕获组。

re.search(r'(?P<hhh>ab+)',"ababababab").group('hhh')
'ab'

6.re模块使用

(1) re.findall(pattern,string,flags = 0)
功能:根据正则表达式匹配目标字符串内容
参数:pattern 正则表达式
string 目标字符串
flags 功能标志位,扩展正则表达式的匹配
返回值:匹配到的列表内容,如果正则表达式有子组只能获取子组内容

import re
s="Alex:1994,Sunny:1996"
pattern = r"(\w+):(\d+)"
l=re.findall(pattern,s)
print(l)
[('Alex', '1994'), ('Sunny', '1996')]

(2)regex = compile(pattern,flags = 0)
功能:生成正则表达式对象
参数:pattern 正则表达式
flags 功能标志位,扩展正则表达式的匹配
返回值:正则表达式对象

regex = re.compile(pattern)
l=regex.findall(s,0,12)
print(l)
[('Alex', '1994')]

(3)re.split(pattern,string,flags = 0)
功能:使用正则表达式匹配内容,切割目标字符串
参数:pattern 正则表达式
string 目标字符串
flags 功能标志位,扩展正则表达式的匹配
返回值:切割后的内容列表

import re
s="Alex:1994,Sunny:1996"
pattern = r"(\w+):(\d+)"
l=re.split(r'[:,]',s)
print(l)
['Alex', '1994', 'Sunny', '1996']

(4)re.sub(pattern,replace,string,max,flags = 0)
功能:使用一个字符串替换正则表达式匹配到的内容
参数:pattern 正则表达式
replace 替换的字符串
string 目标字符串
max 最多替换几处,默认替换全部
flags 功能标志位,扩展正则表达式的匹配
返回值:替换后的字符串

import re
s="Alex:1994,Sunny:1996"
pattern = r"(\w+):(\d+)"
s=re.sub(r':',"_",s)
print(s)
Alex_1994,Sunny_1996

(5)re.match(pattern,string,flags = 0)
功能:匹配某个字符串中开始位置
参数:pattern 正则表达式
string 目标字符串
返回值:匹配内容 match object

import re
s="Alex:1996,Sunny:1998"
pattern =r"(\w+):(\d+)"
m=re.match(r'\w+?',s)
print(m.group())
A

(6)re.search(pattern,string,flags=0)
功能:匹配目标字符串中第一个符合内容的
参数:pattern 正则表达式
string 目标字符串
返回值:匹配内容 match object

import re
s="alex:1996,bop:1998"
pattern =r"(\w+):(\d+)"
m=re.search(r'\d+',s)
print(m.group())
1996

(7)re.finditer(pattern,string,flags = 0)
功能:根据正则表达式匹配目标字符串内容
参数:pattern 正则表达式
string 目标字符串
flags 功能标志位,扩展正则表达式的匹配
返回值:匹配结果的迭代器

import re
s="alex:1996,bop:1998"
pattern =r"(\w+):(\d+)"
it = re.finditer(pattern,s)
for i in it:
    print(i)

    
<re.Match object; span=(0, 9), match='alex:1996'>
<re.Match object; span=(10, 18), match='bop:1998'>

(8)re.fullmatch(pattern,string,flags = 0)
功能:完全匹配某个目标字符串
参数:pattern 正则表达式
string 目标字符串
返回值:匹配内容 match object

import re
s="快乐,辉煌灿烂"
pattern = r'\d+'
m=re.fullmatch(r'[,\w]+',s)
print(m)
['快乐,辉煌灿烂']

7.flags扩展功能

a.只能匹配ASCII编码

import re
s='''Hello
北京'''
regex=re.compile(r'\w+',flags=re.A)
l=regex.findall(s)
print(l)
['Hello']

b.不区分大小写

import re
s='''Hello
北京'''
regex = re.compile(r'[a-z]+',flags=re.I)l=regex.findall(s)
print(l)
['Hello']

c.可以匹配换行

import re
s='''Hello
北京'''
regex=re.compile(r'.+',flags=re.S)
l=regex.findall(s)
print(l)
['Hello\n北京']

d.^ & 匹配每一行开头结尾位置

import re
s='''Hello
北京'''
regex=re.compile(r'^北京',flags=re.M)
l=regex.findall(s)
print(l)
['北京']
regex=re.compile(r'Hello&',flags=re.M)
l=regex.findall(s)
print(l)
['Hello']

(若想使用多个flags,可以使用按位或连接)

8. 正则表达式练习

1.匹配一个.com邮箱格式字符串

import re
re.findall(r"\w+@\w+\.com","qq@163.com")
['qq@163.com']

2.匹配一个由8-12位数字字母下划线组成的密码

import re
re.findall(r"\w{8,12}","zxcvb12345")
['zxcvb12345']

3.匹配一个由整数、负数、整数、小数、分数、百分数组成的数字

import re
re.findall(r"-?\d+/?\.?\d*%?","99 -6 3.7 77% 6/7")
['99', '-6', '3.7', '77%', '6/7']

4.匹配一段文字中以大写字母开头的单词

import re
re.findall(r"\b[A-Z][-_a-zA-Z]*","Hello,Python,oMy")
['Hello', 'Python']

知识回顾

Python中实现列表中某个元素的3种方法:remove,pop,del.
(1)remove:删除单个元素,删除首个符合条件的元素,按值删除

s=[1,2,3,4,5]
s.remove(5)
print(s)
[1,2,3,4]

(2)pop:删除单个或多个元素,根据索引值删除

s=[1,2,3,4,5]
s.pop(1)
print(s)
[1,3,4,5]

(3)del:根据索引值来删除;删除指定范围内的值;删除整个数据对象

s=[1,2,3,4,5]
del s[1:3]
print(s)
[1,4,5]

第二次考核总结

与第一次考核成绩相比,第二次有了不明显进步,主要是因为这两周没有再出现掐点到小组的情况,能够保证基本的学习时间;同时在小组的效率也有了一定提高。做的不够好的地方就是过分依赖网络上别人的做题思路,在接下来的学习中要改进这一点。还有一点做的不够好的地方就是遇到不会的题或知识想不明白就放弃了,没有钻研精神。学习是一个持之以恒的过程,要要踏实地,一步一个脚印。
我总结了一下考核题不会做的原因:平时做题少,做过的题没有完全掌握。为了改善这点,我觉得可以利用闲暇时间多记记基础知识,毕竟只有坚实的基础才能使后面的学习更加顺利。还要不定时复习回顾以前学的知识,如果不进行复习,过段时间就全都忘了,过后还得重新学习,这样就相当于每天都在学习新知识,无形中给自己增加了负担。
要培养自己对学习的兴趣,提高自己的注意力。继续努力。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值