• 第7章 模式匹配与正则表达式


    1. 不用正则表达式来查找文本模式

    def isPhoneNumber(text):
        if len(text) != 11:
            return False
    
        for i in range(0, len(text)):
            if (i == 3 or i == 7) and text[i] != "-":
                return False
            elif i != 3 and i != 7 and not text[i].isdecimal():
                return False
    
        return True
    
    
    text = "123-456-789"
    print(text)
    print(isPhoneNumber(text))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2. 用正则表达式来查找文本模式

    2.1 创建正则表达式(Regex)对象

    import re
    
    text = re.compile(r'\d\d\d-\d\d\d-\d\d\d')
    
    • 1
    • 2
    • 3

    2.2 匹配Regex对象

    import re
    
    text = re.compile(r'\d\d\d-\d\d\d-\d\d\d')
    match = text.search("~~~123-456-789~~~")
    print(match.group())
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3. 用正则表达式匹配更多模式

    3.1 利用括号分组

    import re
    
    text = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d)')
    match = text.search("~~~123-456-789~~~")
    print(match.group(1))
    # 123
    print(match.group(2))
    # 456-789
    print(match.groups())
    # ('123', '456-789')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3.2 用管道匹配多个分组

    • | :管道
    import re
    
    text = re.compile(r'456|123')
    match = text.search("123-456-789")
    print(match.group())
    # 123
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.3 用问号实现可选匹配

    import re
    
    text = re.compile(r'\d\d\d(~)?\d\d\d')
    match = text.search("123123")
    print(match.group())
    # 123123
    
    match = text.search("123~123")
    print(match.group())
    # 123~123
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3.4 用星号匹配零次或多次

    import re
    
    text = re.compile(r'\d\d\d(~)*\d\d\d')
    match = text.search("123123")
    print(match.group())
    # 123123
    
    match = text.search("123~~~123")
    print(match.group())
    # 123~~~123
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3.5 用加号匹配一次或多次

    import re
    
    text = re.compile(r'\d\d\d(~)+\d\d\d')
    match = text.search("123~123")
    print(match.group())
    # 123~123
    
    match = text.search("123~~~123")
    print(match.group())
    # 123~~~123
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3.6 用花括号匹配特定次数

    import re
    
    text = re.compile(r'\d\d\d(~){3,5}\d\d\d')
    match = text.search("123~~~123")
    print(match.group())
    # 123~~~123
    
    match = text.search("123~~~~~123")
    print(match.group())
    # 123~~~~~123
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    4. 贪心和非贪心匹配

    • 贪心匹配:尽可能匹配最长的字符串
    • 非贪心匹配:尽可能匹配最短的字符串
    import re
    
    text = re.compile(r'(123 ){2,4}')
    match = text.search("123 123 123 123 123 ")
    print(match.group())
    # 123 123 123 123
    
    text = re.compile(r'(123 ){2,4}?')
    match = text.search("123 123 123 123 123 ")
    print(match.group())
    # 123 123
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    5. findall() 方法

    import re
    
    text = re.compile(r'\d\d\d-\d\d\d-\d\d\d')
    match = text.search("~~~123-456-789~~~111-222-333~~~")
    print(match.group())
    # 123-456-789
    
    match = text.findall("~~~123-456-789~~~111-222-333~~~")
    print(match)
    # ['123-456-789', '111-222-333']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    6. 字符分类

    编写字符分类表示
    \d0~9的任何数字
    \D除0~9的数字以外的任何字符
    \w任何字母、数字和下划线字符
    \W除字母、数字和下划线以外的任何字符
    \s空格、制表符或换行符
    \S除空格、制表符和换行符以外的任何字符

    7. 建立自己的字符分类

    import re
    
    text = re.compile(r'[0-5]')
    match = text.findall("1a2b3c4d")
    print(match)
    # ['1', '2', '3', '4']
    
    text = re.compile(r'[abc]')
    match = text.findall("1a2b3c4d")
    print(match)
    # ['a', 'b', 'c']
    
    text = re.compile(r'[^abc]')
    match = text.findall("1a2b3c4d")
    print(match)
    # ['1', '2', '3', '4', 'd']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    8. 插入字符和美元字符

    • ^ :以指定文本开始
    • $ :以指定文本结束
    import re
    
    text = re.compile(r'^\d\d\d')
    match = text.search("123abc456")
    print(match)
    # 
    
    text = re.compile(r'\d\d\d$')
    match = text.search("123abc456")
    print(match)
    # 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    9. 通配字符

    • . :匹配换行符之外的所有字符
    import re
    
    text = re.compile(r'..23')
    match = text.findall("123abc23")
    print(match)
    # ['bc23']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    9.1 用点-星匹配所有字符

    import re
    
    text = re.compile(r'123(.*)456(.*)')
    match = text.findall("123abc456def")
    print(match)
    # [('abc', 'def')]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    9.2 用句点字符匹配换行符

    • re.DOTALL :让句点字符匹配所有字符(包括换行符)
    import re
    
    text = re.compile(r'.*')
    match = text.search("123abc\n456def")
    print(match.group())
    # 123abc
    
    text = re.compile(r'.*', re.DOTALL)
    match = text.search("123abc\n456def")
    print(match.group())
    # 123abc\n456def
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    10. 不区分大小写的匹配

    • re.I :不区分大小写
    import re
    
    text = re.compile(r'abc', re.I)
    match = text.findall("abcABC")
    print(match)
    # ['abc', 'ABC']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    11. 用 sub() 方法替换字符串

    import re
    
    text = re.compile(r'ABC\w*')
    match = text.sub("abc", "ABC : 123")
    print(match)
    # abc : 123
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    DeepStream系列之yolov6部署测试
    GCN 链结预测 负采样 想要请教链结预测当中的负采样问题
    创建自定义异常类及封装web返回对象
    Java中的图数据库应用:Neo4j入门
    JavaScript快速入门
    Servlet(Cookie和Session)
    数字逻辑·时序线路分析【触发器和时序线路分析方法】
    JavaScript是如何实现模块化的?
    FFmpeg 命令:从入门到精通 | ffplay 命令选项
    git中如何在父仓库提交子仓库的修改
  • 原文地址:https://blog.csdn.net/BlackOrnate/article/details/134435444