正则表达式:使用单个字符串来描述、匹配某个句法规则的字符串。主要通过字符串定义规则,检查输入字符串是否匹配。
Python正则表达式,使用re模块,并基于re模块中三个基础方法(match/search/findall)做正则匹配
#match 从头匹配
import re
s = 'fjofo njkrf njkds"
result = re.match("fjofo", s)
print(result)
print(result.span())#如果匹配成功,则返回字符串所在的长度区间
print(result.group())#如果匹配成功,则返回匹配成功的字符串
#search 搜索匹配,找到一个之后,就停止;整个字符串都找不到,则返回None
result = re.search("ehik", s)
print(result)
#findall 搜索全部匹配,如果找得到,以列表形式输出找到的所有值;找不到则返回空list
result = re.findall("dhfj", s)
print(result)
元字符匹配
单字符匹配
字符 | 功能 |
. | 匹配任意1个字符(除了\n),\. 匹配点本身 |
[ ] | 匹配[]中列举的字符 |
\d | 匹配数字,即0-9 |
\D | 匹配非数字 |
\s | 匹配空白,即空格,tab键 |
\S | 匹配非空白 |
\w | 匹配单词字符,即a-z,A-Z,0-9,_ |
\W | 匹配非单词字符 |
#
#r,表示转义字符无效
s = "fjle $@lk21^&*&h kjsd"
#1、找到全部数字
result = re.findall(r'\d', s)
#2、找到特殊字符
result = re.findall(r'\W', s)
#3、找到全部英文字母
result = re.findall(r'[a-zA-Z]', s)#[]内的定义自由
数量匹配
字符 | 功能 |
* | 匹配前一个规则的字符0~无数次 |
+ | 匹配前一个规则的字符1~无数次 |
? | 匹配前一个规则的字符0次或者1次 |
{m} | 匹配前一个规则的字符出现m次 |
{m,} | 匹配前一个规则的字符出现最少m次 |
{m,n} | 匹配前一个规则的字符出现m到n次 |
边界匹配
字符 | 功能 |
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
\b | 匹配一个单词的边界 |
\B | 匹配非单词边界 |
分组匹配
字符 | 功能 |
| | 匹配左右任意一个表达式 |
() | 将括号中字符作为一个分组 |
#案例分析
#1、匹配账号,只能由字母和数字组成,长度限制6-10位
#规则:^[a-zA-Z0-9]{6,10}$
#2、匹配QQ号,要求纯数字,长度5-11,第一位不为0
#规则:^[1-9][0-9]{4,10}$
#3、匹配邮箱地址,只允许qq,163,gmail
#规则;^[\W-]+(\.[\W-]+)*@(qq|163|gmail)(\.[\W-]+)+$
#规则:[].[].[].[].[].@[].[].[]
#规则:(^[\w-]+(\.[\w-]+)*@(qq|l63|gmail)(\.[\w-]+)*$)
#如果正则中有多个用()括起来的组,findall会给每个组输出一个数;
#如果我们只想要一个组,最外层加个括号就好
递归:
在满足条件的情况下,函数自己调用自己的一种特殊编程技巧(编程时,1、注意退出条件,否则容易编程无限递归;2、注意返回值的传递,确保从最内层,层层传递到最外层)
例子,找出一个文件夹下的所有文件
#演示OS模块的3个基础方法
os.listdir("路径")#显示当前路径下的文件夹
os.patj.isdir("路径")#判断当前路径是否指向一个文件夹,是,返回True
os.path.exists("路径")#判断当前路径是否在存在
#递归找文件
def get_file_rec_from_dir(path):
file_list = []
if os.path.exists(path):
for f in os.listdir(path):
new_path = path + "/" + f
if os.path.isdir(new_path):
file_list += get_file_rec_from_dir(new_path)
else
file_list.append(new_path)
else:
print(f"指定目录{path},不存在")
return []
return file_list
if __name__ = '__main__':
print(get_file_rec_from_dir("D:/test"))