Python基础(正则表达式与re模块)

正则表达式与re模块的应用方法:

  1.1 应用:

    用户输入信息的验证(注册页 登录页)

    数据的提取(爬虫)

  1.2 正则的三大查找方法:

    参数说明   正则表达式   待匹配的字符串 

  
# findall 方法:

# 根据正则规则从一段内容中查找结果
import re
ret = re.findall('\d+', 'aaa')
print(ret)   # 返回一个列表,找不到则返回一个空列表


# search 方法:

# group()没有找到则会报错
import re
ret = re.search('\d', 'alex123yuan234')   # 只取第一个值
print(ret)           # 返回结果集,找不到则为None
# print(ret.group())


# match 方法:

# 从第一个字符串开始找,第一个字符不满足条件则返回None
# 类似 ^ + search 功能
# 返回结果集
import re
ret = re.match('\d', 'alex123yuan234')
print(ret)    # 返回结果集,找不到则为None
if ret:
    print(ret.group())   # 处理没有找到则会报错的情况


# match可以被替代么? 可以
re.search('^\d+','123alex') == re.match('\d+','123alex')
View Code

  1.3  字符串的其他方法:

    参数说明   正则   要换的结果   待匹配的字符串

  
# sub 方法:

import re
ret = re.sub('\d+', 'xxx', 'alex84wusir73')   # 默认替换所有,找不到则返回原字符串
ret = re.sub('\d+', 'xxx', 'alex84wusir73', 1)  # 指定替换次数 1次
print(ret)


# subn 方法
# 以元组形式返回结果,返回替换个数
import re
ret = re.subn('\d+', 'xxx', 'alex84wusir73')
print(ret)    # ('alexxxxwusirxxx', 2)


# split 方法

分组可以保留切除的内容
import re
ret = re.split('\d+', 'alex84wusir73yuan')   # 切片,返回一个列表
ret1 = re.split('\d(\d)', 'alex84wusir73')   # 末尾空字符情况
ret2 = re.split('(\d+)', 'alex84wusir73yuan')   # 分组可以保留切除的字符串 分组优先显示
print(ret)   # ['alex', 'wusir', 'yuan']
print(ret1)   # ['alex', '4', 'wusir', '3', '']
print(ret2)   # ['alex', '84', 'wusir', '73', 'yuan']
View Code

  1.4 进阶方法:

    1.4.1 compile 方法:

      1.4.1.1 优点:
        多次使用时正则表达式时只需要编译一次,节约编译时间
        如果compile方法只执行一次不能节省时间,不能节省编译时间
        compile + finditer:节省时间和内存空间

      

      1.4.1.2re.compile 的方法与内置方法compile方法的区别:
        re.compile 对正则表达式的规则进行预编译,提共编译的结果提供给re模块中的方法进行使用
        内置方法compile: 对python表达式进行预编译,编译成电脑认识的机器码,增加执行效率

      1.4.1.3 示例:

  
# compile 方法:

import re
par = re.compile('\d+')   # 预编译
ret = par.findall('alex84wusir73')  # 编译结果多次使用
ret1 = par.findall('xiao567')     # 编译结果多次使用
ret2 = par.findall('3444span')  # 编译结果多次使用
print(ret, ret1, ret2)
View Code

    1.4.2 finditer 方法:

      1.4.2.1 优点:

        返回一个迭代器
        节省内存空间

      1.4.2.2 示例:

  
# finditer 方法:

import re
ret = re.finditer('\d', 'alex84alex84alex84alex84alex84alex84alex84alex84'*200)
print(ret)   # 生成一个迭代器
print(next(ret).group())  # 查看第一个结果

for i in ret:
    print(i.group())  # 结果集 通过group方法获取值
View Code

  1.5 re模块中分组的概念:

    1.5.1  分组在正则表达式中发挥的作用:
      分组在findall当中默认会优先被显示出来
      如果不想优先,那么在分组中添加(?:正则规则)表示取消这个规则的优先显示

    1.5.2 findall 与 分组:

  
# findall与分组:

# 未做分组处理的结果:
import re
s = '<title>qqxing<\title>'
ret = re.findall('>\w+<', s)
print(ret[0].strip('<>'))  # 通过strip方法切除多余字符

# 小示例:
# 分组的优先显示原则:
import re
ret = re.findall('www.(baidu|python).com', 'www.python.com')
ret2 = re.findall('www.(?:baidu|python).com', 'www.python.com')  # 取消规则
print(ret)    # ['python']
print(ret2)    # ['www.python.com']


# 做分组处理:
import re
s = '<title>qqxing<\title>'
ret = re.findall('>(\w+)<', s)   # 分组永远优先显示分组中的内容
ret2 = re.findall('>(?:\w+)<', s)  # 取消优先显示规则
print(ret)   # ['qqxing']
print(ret2)   # ['>qqxing<']
View Code

    1.5.3 search 与 分组:

  
# search和分组:

import re
ret = re.search(r'<(\w+)>(\w+)<\\(\w+)>', r'<title>qqxing<\title>')
print(ret.group(0))  # 不受到分组的影响,默认返回匹配的所有
print(ret.group(1))  # 分组1 title
print(ret.group(2))  # 分组2 qqxing
print(ret.group(3))  # 分组3 title
View Code

  1.6 分组命名 与 引用 分组:

    1.6.1 格式:

       ?P<组名>
       引用分组(?P=组名)

    1.6.2 示例:

  
# 分组命名:

import re
s = r'<title>qqxing<\title>'
ret = re.search(r'<(?P<tab1>\w+)>(?P<content>\w+)<\\(\w+)>', s)  # 分组命名
print(ret.group(0))  # 不受到分组的影响
print(ret.group('tab1'))  # group('tab1') == group(1)
print(ret.group('content'))  # 通过组名拿到值


# 引用分组:
import re
s = '<h1>wahaha</h2></h1></h3>'
ret = re.search('<(?P<tag>\w+)>.*</(?P=tag)>', s)  # 引用分组
print(ret.group())

# 特殊方法引用:
# 如果不给组起名字,也可以用\序号来找到对应的组,表示要找的内容和前面的组内容一致
import re
s = '<h1>wahaha</h2></h1></h3>'
ret = re.search(r'<(\w+)>.*</\1>', s)   # 特殊方法
print(ret.group())
View Code

  1.7 综合小实例:

  
# 小示例:

# 匹配整数示例:
import re

ret = re.findall(r"\d+", "1-2*(60+(-40.35/5)-(-4*3))")
print(ret)  # ['1', '2', '60', '40', '35', '5', '4', '3']
ret = re.findall(r"-?\d+\.\d*|(-?\d+)", "1-2*(60+(-40.35/5)-(-4*3))")
print(ret)  # ['1', '-2', '60', '', '5', '-4', '3']
ret.remove("")   # 除去空字符
print(ret)  # ['1', '-2', '60', '5', '-4', '3']

# 匹配时间:
# 匹配一段文本中的每行的时间字符串,比如:‘1990-07-12’
# 分别取出1年的12个月(^(0?[1-9]|1[0-2])$)、
# 一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$

# 匹配其他:
# 匹配qq号。(腾讯QQ号从10000开始)  [1,9][0,9]{4,}
# 匹配一个浮点数。       ^(-?\d+)(\.\d+)?$   或者  -?\d+\.?\d*
# 匹配汉字。             ^[\u4e00-\u9fa5]{0,}$ 
View Code

     

posted @ 2019-03-23 16:56  Amorphous  阅读(160)  评论(0编辑  收藏  举报