day21 正则表达式

昨日内容回顾

模块的查找顺序

1.先从内存中查找
2.再从内置模块中查找
3.在从环境变量sys.path中查找
​
# 起模块名字的时候千万不要和内置模块名字冲突了
import sys
sys.patn # ['执行文件路径','pycharm给你加的项目的路径']
​
​
如果遇到模块找不到的情况:
    1.把要找的模块所在的路径添加到环境变量中
        import sys
        sys.path.append('')
    2.还可以使用from...import...句式
        from 模块名.模块名.模块名 import 名字

相对导入和绝对导入

绝对导入
    始终以执行文件所在的sys.patn路径为准
相对导入
    .(句点符号) # 当前路径
    from . import 模块名
    '''可以不依赖执行文件所在的路径,而是看两个模块之间的位置关系'''
​
# 出现相对导入的文件语句,就不能作为执行语句了

包的使用

包其实就是一个文件夹,只是包里有个__init__.py文件
包是一系列功能模块的组合(py文件)
​
# 包如何使用
import bbb(包名)
​
'''导入包的时候其实导入的是包下的__init__.py文件'''
# 后续我们可能会在项目中封装各种各样的包,一个包一般情况就是一个大的功能,而且包中使用的代码、路径等都不相互依赖

正则表达式

正则他是一门独立的语言,意味着学习了正则可以在很多地方使用
​
正则就是通过一些特殊符号筛选出符合我们规则的数据
​
案例:匹配手机号规则
​
'''在python中使用正则,需要使用re模块'''
字符组:
    [0123456789] # 匹配0~9中的任意数字

今日内容概要

  • 字符

  • 量词

  • 贪婪匹配和非贪婪匹配

  • 正则练习题

  • 取消转义

  • re模块下的常用方法

  • 无名分组和有名分组(重点)

  • 利用re模块爬取红牛分公司数据

  • time和datatime模块

  • random模块

今日内容详解

字符

元字符  匹配内容
.   匹配除换行符以外的任意字符
\w  匹配字母或数字或下划线
\s  匹配任意的空白符
\d  匹配数字
\n  匹配一个换行符
\t  匹配一个制表符
\b  匹配一个单词的结尾
^   匹配字符串的开始
$   匹配字符串的结尾
\W  匹配非字母或数字或下划线
\D  匹配非数字
\S  匹配非空白符
a|b 匹配字符a或字符b
()  匹配括号内的表达式,也表示一个组
[...]   匹配字符组中的字符
[^...]  匹配除了字符组中字符的所有字符

量词

1.量词只能影响前面一个字符(ab+  影响b)
2.不能够单独使用,只能配合表达式使用
​
​
量词  用法说明
*   重复零次或更多次
+   重复一次或更多次
?   重复零次或一次
{n} 重复n次
{n,}    重复n次或更多次
{n,m}   重复n到m次

贪婪匹配

# 待匹配的文本

​
# 正则
<.*>
# 
​
'''尽量多的匹配'''
​
取消贪婪匹配
<.*?>
.*?------>尽量少的匹配

取消转义

\\n   '\n'
​
\\\\n  '\\n'

re模块下的常用方法

在Python中,如过使用正则,需要借助于模块,re模块
​
regluar express-------------> re
​
import re
​
# ret = re.findall('正则', '待匹配内容')  # 返回所有满足匹配条件的结果,放在列表里
"""待匹配内容一定是一个字符串,文本. []"""
# ret = re.findall('ab', 'eva egon yuan a')  # 返回所有满足匹配条件的结果,放在列表里
"""如果匹配到内容就把数据以列表的形式返回, 如果匹配不到就返回[]"""
# print(ret)  # ['a', 'a']
# if ret:
#     pass
# else:
#     pass
​
ret = re.search('ab', 'eva egon yuan')
print(ret) #结果 : 'a'
# print(ret.group())  # a
# 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以
# 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
​
# if ret:
#     print(ret.group())
# else:
#     print(ret)
# try:
#     ret = re.search('a', 'eva egon yuan').group()
#     print(ret)
# except Exception:
#     print(ret)
​
​

ret = re.match('a', 'ewqeqwabc')  # 同search,不过尽在字符串开始处进行匹配
print(ret)
try:
    ret = re.match('a', 'ewqeqwabc').group()
    print(ret)
except Exception:
    print(ret)
​
​

分组

无名分组:使用小括号括起来的正则表达式就是无名分组
​
    '''常用'''
​
    res = re.search('^[1-9](\d{14})(\d{2}[0-9x])?$','110105199812067023')
    print(res)
    print(res.group())  # 110105199812067023
    print(res.group(1))  # 10105199812067
    print(res.group(2))  # 023
    
    # findall针对分组优先展示   无名分组
    """
    如果是findall,分组优先展示,无名分组
    """
    res = re.findall("^[1-9](\d{14})\d{2}[0-9x]?$",'110105199812067023')
    print(res)  # ['023']
    
有名分组:使用小括号括起来的正则表达式然后给起个名字就是有名的
    res = re.search('^[1-9](?P\d{14})(?P\d{2}[0-9x])?$','110105199812067023')
    print(res)
    print(res.group(1))
    print(res.group(2))
    print(res.group('xxx'))
    print(res.group('ooo'))

案例

爬取红牛分公司官网数据
​
with open('a.txt', 'r', encoding='utf-8') as f:
    data = f.read()
​
import re
title_list = re.findall('

(.*?)

', data) address_list = re.findall("

(.*?)

", data) email_list =  re.findall("

(.*?)

", data) phone_list =  re.findall("

(.*?)

", data) ​ res_list = zip(title_list, address_list, email_list, phone_list) # print(list(res_list)) ​ for i in list(res_list):    print("""       公司名称:%s,       公司地址:%s,       公司邮编:%s,       公司电话:%s,   """ % (i[0], i[1], i[2], i[3]))

你可能感兴趣的:(python,前端,数据库)