正则表达工

落花浮王杯 提交于 2019-12-02 22:11:53

Web服务器 3.1


3.1.1 正则表达式

    # coding = utf-8
    # 导入re模块
    import re

    # 使用match方法操作
    result = re.match(正则表达式,要匹配的字符串)

    # 如果匹配到数据的话,可以用group()来提取
    if result:
        result.group()
    else:
        break

3.1.2 re模块示例(匹配以itcast开头的语句)

    import re
    result = re.match(r"itcast","itcasterer")
    result.group()

运行的结果是:

    itcast

3.1.3 匹配单个字符

序号符号定义
1. . 匹配任意一个字符,除了\n
2. [] 匹配[]中列举的字符
3. \d 匹配任意数字0-9
4. \D 匹配非数字
5. \s 匹配空格键或TAB键
6. \S 匹配非空格
7. \w 匹配单字符a-z A-Z 0-9 和_
8. \W 匹配非单字符

3.1.4 匹配多个字符

序号符号定义
1 * 匹配前一个字符出现0次或无限次,即可有可无;如:s*
2 + 匹配前一个字符出现1次或无限次,即至少有1次
3 匹配前一个字符出现1次或者0次,即要么有一次,要么没有
4 {m} 匹配前一个字符出现m次;例:[a-z]{4,36}表示字符串为小写4-26位
5 {m,n} 匹配前一个字符出现m-n次

示例1 匹配第一个字母为大写,第二个字符小写可有可无

    import re


    ret = re.match(r"[A-Z][a-z]*$", "Ma")
    if ret:
        print(ret.group())
    else:
        print("不能匹配")

    ret = re.match(r"[A-Z][a-z]*$", "M")
    if ret:
        print(ret.group())
    else:
        print("不能匹配")

    ret = re.match(r"[A-Z][a-z]*$", "MO")
    if ret:
        print(ret.group())
    else:
        print("不能匹配")

    ret = re.match(r"[A-Z][a-z]*$", "mO")
    if ret:
        print(ret.group())
    else:
        print("不能匹配")

运行后的结果为

    zz_03_验证邮箱是否正确.py
    Ma
    M
    不能匹配
    不能匹配

示例2:判断变量名是否符合要求

    import re

    def main():
        names = ["age", "lage", "age1", "age_1", "age!", "a#1224", "___ __", "_Mare_*"]
        for name in names:
            data = re.match(r"[a-zA-Z_][a-zA-Z0-9_]*$", name)
            if data:
                print("变量名%s正确" % name)
            else:
                print("变量名%s不正确" % name)

    if __name__ == "__main__":
        main()

运行结果

    变量名age正确
    变量名lage正确
    变量名age1正确
    变量名age_1正确
    变量名age!不正确
    变量名a#1224不正确
    变量名___ __不正确
    变量名_Mare_*不正确

3.1.5 匹配开头和结尾

序号表达式说明
1 ^ 匹配字符串的开头
2 $ 匹配字符串的结尾

示例3 判断163邮箱是否正确

    import re

    def email(email_adr):
        adr = re.match(r"[a-zA-Z1-9][A-Za-z1-9_]{3,19}@163\.com$", email_adr)
        if adr:
            print("邮箱地址%s 正确" % email_adr)
        else:
            print("邮箱地址%s 不正确" % email_adr)

    while True:
        email_adr_in = input("请输入你的邮箱地址(退出输exit):")
        if email_adr_in == "exit" or email_adr_in == "EXIT":
            break
        else:
            email(email_adr_in)

运行结果

    请输入你的邮箱地址(退出输exit):zhao@163.com
    邮箱地址zhao@163.com 正确
    请输入你的邮箱地址(退出输exit):1wangwu@163.com
    邮箱地址1wangwu@163.com 正确
    请输入你的邮箱地址(退出输exit):_wangwu@163.com
    邮箱地址_wangwu@163.com 不正确
    请输入你的邮箱地址(退出输exit):@123@163.com
    邮箱地址@123@163.com 不正确
    请输入你的邮箱地址(退出输exit):12345@1632.com
    邮箱地址12345@1632.com 不正确
    请输入你的邮箱地址(退出输exit):EXIT

    进程已结束,退出代码 0

3.1.6 正则表达式 分组

序号字符功能
1 I 匹配左右任意一个表达式
2 (ab) 将括号中的字符作为一个分组
3 \num 引用分组num匹配到字符串
4 (?p) 分组起别名
5 (?P=nmae) 引用别名为name分组匹配到的字符串

示例4 (?P)和(?P=name)的使用

    import re

    text1 = "<body><h1>welcome to Jaguar and Landrover</h1></body>
    ret = re.match(r"<(?P<p1>\w*)><(?P<p2>\w*)>.*</(?P=p2)></(?P=p1)>",text)
    print(ret.group())

3.1.7 re模块的其它高级用法

search 示例 匹配出文章阅读次数

     import re
    ret = re.search(r"\d+),"阅读次数为999")
    ret.group()

    运行结果:
    ‘999’

findall示例 统计出python c c++相应的阅读次数

    import re
    ret = re.findall(r"\d+","python = 1212, c = 5454, c++ = 2343")
    print(ret)

    运行结果:
    ['1212', '5454', '2343']

sub的应用 示例:sub 将替换程序中的所有任合值

    In [75]: re.sub(r"\d+",'999',"python = 123, c = 234, c++ = 456")
    Out[75]: 'python = 999, c = 999, c++ = 999'

sub案例2,将统计到的次数加1

    """sub在调用函数功能"""
    import re

    def add(number):
        temp_num = number.group()
        num = int(temp_num) + 1
        return str(num)

    ret = re.sub(r"\d+", add, "python = 1314")
    print(ret)

    ret = re.sub(r'\d+', add, "python = 1232, c++ = 3454")
    print(ret)

    运行结果:
    python = 1315
    python = 1233, c++ = 3455

    进程已结束,退出代码 0

split切割字符用

    In [76]: re.split(r":| ","python:google c++ 444: american")
    Out[76]: ['python', 'google', 'c++', '444', '', 'american']

总结高级功能

序号命令功能
1 search 查找字符串中相应的数字或字符,只会找出一个
2 findall 查找出字符串中所有的数据或字符,找出所有,并反回列表
3 sub 将找出的相应的结果替换掉,替换所有
4 split 按照设定的规格进行切割,并返回列表

练习题 将网页上抓取的信息,递出其中的特殊符号,并重新排版打印

    #coding:utf-8

    import re

    text = "<p>岗位职责<br>1、参与系统的需求调研和需求分析&nbsp;;<br>2、搭建系统开发环境,完成系统框架和核心代码的实现;<br>3、负责java性能分析软件的开发;<br>4、系统开发测试、部署和集成;<br>5、负责解决开发过程中的技术问题;<br>6、参与代码维护与备份。<br>&nbsp;<br>我们的要求<br>1. 1年以上的java/C#/C++/Ruby/Python等语言开发经验
;<br>2.&nbsp;熟悉OO;<br>3.&nbsp;熟悉SQL、NoSQL等主流数据库;<br>4.&nbsp;有良好的编程风格,能够书写规范、优质的代码
;<br>5.&nbsp;良好的团队协作能力;<br>&nbsp;<br>如果你还具备以下技能那就更好了:<br>1.&nbsp;喜欢阅读源代码;<br>2.&nbsp;热爱阅读各类技术、非技术书籍;<br>3.&nbsp;喜欢学习,拥有持续学习的能力,认为学习本身就是一种乐趣;<br>4.&nbsp;喜欢开源软件,乐于知识分享;<br>5.&nbsp;拥有自我管理能力,自我驱动,做自己的老板。</p>"
    new_text = re.sub(r"(<[\w/]*>|&nbsp;)", "", text)
    new_text = re.sub(r"\.|、", "", new_text)
    new_list = re.split(r"\d+",new_text)

    n = 1
    for cut_text in new_list:
        if cut_text:
            print(n, ".\t",  cut_text)
            n += 1
        else:
            break

    运行的结果如下:
    1 .     岗位职责
    2 .     参与系统的需求调研和需求分析;
    3 .     搭建系统开发环境,完成系统框架和核心代码的实现;
    4 .     负责java性能分析软件的开发;
    5 .     系统开发测试部署和集成;
    6 .     负责解决开发过程中的技术问题;
    7 .     参与代码维护与备份。我们的    8 .      
    9 .     年以上的java/C#/C++/Ruby/Python等语言开发经验;
    10 .     熟悉OO;
    11 .     熟悉SQLNoSQL等主流数据库;
    12 .     有良好的编程风格,能够书写规范优质的代码;
    13 .     良好的团队协作能力;如果你还具备以下技能那就更好了:
    14 .     喜欢阅读源代码;
    15 .     热爱阅读各类技术非技术书籍;
    16 .     喜欢学习,拥有持续学习的能力,认为学习本身就是一种乐趣;
    17 .     喜欢开源软件,乐于知识分享;
    18 .     拥有自我管理能力,自我驱动,做自己的老板。

    进程已结束,退出代码 0
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!