美文网首页
Python_Re库(正则表达式)

Python_Re库(正则表达式)

作者: 听不听不听 | 来源:发表于2020-04-22 18:05 被阅读0次

    正则表达式(一行胜千言)

    正则表达式(Regular Expression)又称规则表达式,是计算机科学领域的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。以下介绍Python中Re库基本内容与使用方法:

    • raw string和string类型
    • 基本语法规则
    • 主要功能函数
    • match对象及其属性
    • 修饰符
    • 正则表达式应用案例

    1.raw string和string类型

    正则表达式有两种表示类型:raw string(原生字符串类型)和string类型。
    raw string类型是不包含转义符 \ 的字符串,表示为r'text',例如r'[1-9]\d{5}'
    string类型是包含转义符的字符串,表示为'text',因此使用更加繁琐,在使用某些包含斜杠的元字符时需要增加转义符,例如:'[1-9]\\d{5}'

    2.基本语法规则

    (1)元字符

    匹配位置的元字符

    ^ $ \b
    匹配开头 匹配结尾 匹配开头或结尾
    “^abc”匹配以“abc”开头的字符串 “abc$”匹配以“abc”结尾的字符串 r“abc\b”匹配以“abc”开始或者结尾的单词

    注:
    “^abc$”匹配以“abc”开始和结尾的字符串。
    \b不匹配空格、标点符号或换行符号。
    匹配字符的元字符

    . \W \s \S \d \D
    匹配除换行之外的任意字符 匹配单词字符 匹配任意非单词字符 匹配任意的空白字符 匹配任意的非空白字符 匹配任意的非数字字符
    (2)字符类

    字符类是一个字符集合,如果该字符集合中的任何一个字符被匹配,则它会找到该匹配项。字符类可以在方括号“[]”中定义。

    例如:[012345]可以匹配数字0到5中的任意一个;[0-9]等价于[0123456789],可匹配任何一个数字。

    连字符“-”
    如果要在字符类中包含连字符“-”,则必须包含在第一位,例如:[-a]表示表达式匹配-或者a。

    否定字符“^”
    如果^是字符类的第一个字符表示否定该字符串,也就是匹配该字符串外的任意字符。例如:[^abc]匹配除了abc以外的任意字符;

    反/转义字符“\”
    在查找元字符本身的时,例如,查找“.”或者“*”时,需要使用“\”转义符来取消这些字符的特殊意义。

    限定符

    字符 功能
    * 零次或多次
    + 一次或多次
    ? 零次或一次
    *? 尽可能少的使用重复的第一个匹配
    +? 尽可能少的使用重复但至少使用一次
    ?? 如果有可能使用零次重复或一次重复
    {n} 匹配确定的n次
    {n,} 至少匹配n次
    {n,m} 最少匹配n次且最多匹配m次

    注:m和n均为非负整数

    (3)懒惰匹配和贪婪匹配

    原始字符串: PYANBNCNDN
    懒惰匹配正则表达式: PY.?N
    懒惰匹配结果: PYAN
    贪婪匹配正则表达式: PY.
    N
    贪婪匹配结果:PYANBNCNDN

    (4)两种表达方式

    图片来源:中国大学慕课《Python网络爬虫与信息提取》

    3.主要功能函数


    图片来源:中国大学慕课《Python网络爬虫与信息提取》

    示例如下:

    import re
    #匹配第一个
    match = re.search(r'[1-9]\d{5}','BIT 100081 TSU100084')
    if match:
        print("search:",match.group(0))
        print(match.re)
    

    search: 100081

    import re
    #re.match从首字母匹配第一个
    match1 = re.match(r'[1-9]\d{5}','BIT 100081')
    if match1:
        print(match1.group(0))
    match2 = re.match(r'[1-9]\d{5}','100081')
    if match2:
        print("match2:",match2.group(0))
    

    match2: 100081

    import re
    #匹配所有
    ls = re.findall(r'[1-9]\d{5}','BIT 100081 TSU100084')
    print("ls:",ls)
    

    ls: ['100081', '100084']

    import re
    #分割
    print("split:",re.split(r'[1-9]\d{5}','BIT 100081 TSU100084'))
    print("split_maxsplit=1:",re.split(r'[1-9]\d{5}','BIT 100081 TSU100084',maxsplit=1))
    

    split: ['BIT ', ' TSU', '']
    split_maxsplit=1: ['BIT ', ' TSU100084']
    注:maxsplit可以指定分割次数

    import re
    #finditer
    for m in re.finditer(r'[1-9]\d{5}','BIT 100081 TSU100084'):
        if m:
            print("finditer",m.group(0))
    

    finditer 100081
    finditer 100084

    import re
    sub替换正则表达式匹配的旧字符串
    sub = re.sub(r'[1-9]\d{5}',':zipcode','BIT 100081 TSU100084')
    print('sub:',sub)
    

    sub: BIT :zipcode TSU:zipcode

    4.match对象属性及方法


    图片来源:中国大学慕课《Python网络爬虫与信息提取》

    5.修饰符


    图片来源:中国大学慕课《Python网络爬虫与信息提取》

    6.正则表达式应用案例

    电子邮箱匹配

    #电子邮箱匹配
    import re
    pattern='[a-zA-Z0-9_-]+@+[a-z0-9A-Z]+\.(com|cn|net)'
    email1='whuer123@123.com'
    email2='小明123@123.com'
    email3='whuer123@12'
    result=re.match(pattern,email1)
    if result:
        print(email1, '匹配')
    else:
        print(email1, '不匹配')
    result=re.match(pattern,email2)
    if result:
        print(email2, '匹配')
    else:
        print(email2, '不匹配')
    result=re.match(pattern,email3)
    if result:
        print(email3, '匹配')
    else:
        print(email3, '不匹配')
    

    whuer123@123.com 匹配
    小明123@123.com 不匹配
    whuer123@12 不匹配

    相关文章

      网友评论

          本文标题:Python_Re库(正则表达式)

          本文链接:https://www.haomeiwen.com/subject/axkwihtx.html