美文网首页
正则表达式

正则表达式

作者: 阿猫阿狗py | 来源:发表于2018-09-02 20:18 被阅读11次

    1. 什么是正则表达式

    正则表达式,也称为规则表达式,英文名称Regular Expression,我们在程序中经常会缩写为regex或者regexp,专门用于进行文本检索、匹配、替换等操作的一种技术。

    2. Python中的正则表达式

    2.1 Python中的正则表达式模块re

    Python提供的正则表达式处理模块re,提供了正则表达式的处理函数

    2.2 字符串查询匹配的函数

    函数 描述
    re.match(reg,info) 用于在开始位置匹配目标字符串info中符合正则表达式reg的字符,匹配成功会返回一个match对象,匹配不成功返回None
    re.serach(reg,info) 扫描整个字符串info,使用正则表达式reg进行匹配,匹配成功返回匹配的第一个match对象,匹配不成功返回None
    re.findall(reg,info) 扫描整个字符串info,经复核正则表达式reg的字符串全部提取出来存放在列表中返回
    re.fullmatch(reg,info) 扫描整个字符串,如果整个字符串都包含在正则表达式表示的范围中,返回整个字符串,否则返回None
    re.finditer(reg,info) 扫描整个字符串,将匹配到的字符包含在一个可以遍历的列表中

    2.3 字符串拆分替换的函数

    函数 描述
    re.split(reg,string) 使用指定的正则表达式reg匹配的字符,将字符串string拆分成一个字符串列表,如:re.split(r”\s+”,info),表示使用一个或者多个空白字符串info进行拆分,并返回一个拆分后的字符串列表
    re.sub(reg,repl,string) 使用指定的字符串repl来替换目标字符串string中匹配正则表达式reg的字符

    2.4 正则表达式中的元字符

    元字符 描述
    ^ 表示匹配字符串的开头位置的字符
    $ 表示匹配字符串的结束位置的字符
    . 表示匹配任意一个字符
    \d 匹配一个数字字符
    \D 匹配一个非数字字符
    \s 匹配一个空白字符
    \S 匹配一个非空白字符
    \w 匹配一个数字/字母/下划线中任意一个字符
    \W 匹配一个非数字字母下划线的任意一个字符
    \d 匹配一个单词的边界
    \B 匹配不是单词的开头或者结束位置

    2.5 实例

    1. re.match()
    import re
    info1 = "Hello world,you are beautiful"
    info2 = "hello%"
    #定义正则表达式
    regStart = r"wow"
    #从字符串开始位置匹配,是否包含符合正则表达式的内容
    print(re.match(regStart,info1))
    
    
    1. re.search
    import re
    info1 = "Hello world,you are beautiful, you are cute"
    info2 = "hello%"
    #定义正则表达式
    regStart = r"are"
    #扫描整个字符串,是否包含符合正则表达式的内容,返回匹配到的第一个字符串的match对象
    print(re.search(regStart,info1))
    
    #输出:<_sre.SRE_Match object; span=(16, 19), match='are'>
    
    1. re.findall()
    import re
    info1 = "Hello world,you are beautiful, you are cute"
    info2 = "hello%"
    
    #定义正则表达式
    regStart = r"are"
    #扫描整个字符串,是否包含符合正则表达式的内容,返回匹配到的字符串的迭代对象
    print(re.findall(regStart,info1))
    
    #输出:['are', 'are']
    
    
    1. re.fullmatch()
    import re
    info1 = "Hello world,you are beautiful, you are cute"
    info2 = "hello%"
    info3 = 'hello'
    
    #定义正则表达式
    regStart = r"are"
    
    #扫描整个字符串,是否包含符合正则表达式的内容,返回匹配到的第一个字符串的match对象
    print(re.fullmatch(r"\w*",info3))
    print(re.fullmatch(r"\w*",info2))
    
    #输出:<_sre.SRE_Match object; span=(0, 5), match='hello'>
    None
    
    

    2.6 正则表达式中的词量

    词量 描述
    x* 用于匹配符号*前面的字符出现0次或者多次
    x+ 用于匹配符号+前面的字符出现1次或者多次
    x? 用于匹配符号?前面的字符出现0次或者1次
    x{n} 用于匹配符号{n}前面的字符出现n次
    x{m,n} 用于匹配符号{m,n}前面的字符至少出现m次,最多n次
    x{n,} 用于匹配符号{n,}前面的字符至少出现n次

    2.6.1 实例

    import re
    info = "look look!,good gooood!"
    
    #匹配一段字符中出现单词o字符0次或多次的情况
    print(re.findall(r"o*",info))
    
    #匹配一段字符串中出现单词o字符出现1次或多次的情况
    print(re.findall(r"o+",info))
    
    #匹配一段字符串中出现单词o字符出现0或1次的情况
    print(re.findall(r"o?",info))
    
    #匹配字符串中连续出现2次字符o的情况
    print(re.findall(r"o{2}",info))
    
    #匹配字符串中连续出现2次以上字符o的情况
    print(re.findall(r"o{2,}",info))
    
    #匹配字符串中连续出现2次以上3次以内o字符的情况
    print(re.findall(r"o{2,3}",info))
    
    #输出:
    ['', 'oo', '', '', '', 'oo', '', '', '', '', 'oo', '', '', '', 'oooo', '', '', '']
    ['oo', 'oo', 'oo', 'oooo']
    ['', 'o', 'o', '', '', '', 'o', 'o', '', '', '', '', 'o', 'o', '', '', '', 'o', 'o', 'o', 'o', '', '', '']
    ['oo', 'oo', 'oo', 'oo', 'oo']
    ['oo', 'oo', 'oo', 'oooo']
    ['oo', 'oo', 'oo', 'ooo']
    
    

    2.7 正则表达式中的范围匹配

    范围 描述
    [0-9] 用于匹配一个0-9之间的数字,等价于\d
    [^0-9] 用于匹配一个非数字字符,等价于\D
    [3-6] 用于匹配一个3-6之间的数字
    [a-z] 用于匹配a-z之间的数字
    [A-Z] 用于匹配一个A~Z之间的字母
    [a-zA-Z] 用于匹配一个a~z或者A-Z之间的字母,匹配任意一个字母
    [a-zA-Z0-9] 用于匹配一个字母或者数字
    [a-zA-Z0-9_] 用于匹配一个字母或者数字或者下划线,等价于\w
    [^a-zA-Z0-9_] 用于匹配一个非字母或者数字或者下划线,等价于\W

    2.7.1 实例

    
    import re
    info = "Hello World_!.The price is 100!"
    
    #匹配字符串中的数字
    print(re.findall(r"[0-9]+",info))
    #匹配小写字母
    print(re.findall(r"[a-z]+",info))
    #匹配大写字母
    print(re.findall(r"[A-Z]+",info))
    #匹配所有字母
    print(re.findall(r"[A-Za-z]+",info))
    #匹配小写字母和下划线
    print(re.findall(r"[a-z_]+",info))
    
    #输出:
    ['100']
    ['ello', 'orld', 'he', 'price', 'is']
    ['H', 'W', 'T']
    ['Hello', 'World', 'The', 'price', 'is']
    ['ello', 'orld_', 'he', 'price', 'is']
    
    

    2.8 正则表达式中的分组

    分组 描述
    (expression) 使用圆括号直接分组;正则表达式本身匹配的结果就是一个组,可以通过group()或者group(0)获取;正则表达式中包含的圆括号就是按照顺序从1开始编号的小组
    (?P<name>expression) 使用圆括号分组,然后给当前的圆括号表示的小组命名为name,可以通过group(name)进行数据的获取

    2.8.1 实例

    
    import re
    
    phone = input("请输入:")
    #进行正则匹配,得到match对象,对象中包含了分组信息
    reg = re.search(r"^(\d{3,4})-(\d{4,8})$", phone)
    print(reg)
    
    #匹配结果为默认的组,可以通过group()或者group(0)获取
    print(reg.group())
    #获取结果中第一个括号对应的组数据:处理区号
    print(reg.group(1))
    #获取第二个括号对应的组数据:处理号码
    print(reg.group(2))
    
    #输出:
    请输入:010-6612345
    <_sre.SRE_Match object; span=(0, 11), match='010-6612345'>
    010-6612345
    010
    6612345
    
    
    import re
    
    phone = input("请输入:")
    
    # 进行正则匹配,得到Match对象,对象中就包含了命名分组信息
    res2 = re.search(r"^(?P<nstart>\d{3,4})-(?P<nend>\d{4,8})$", phone)
    # 查看匹配结果
    print(res2)
    # 匹配结果为默认的组,可以通过group()或者group(0)获取
    print(res2.group(0))
    # 通过名称获取指定的分组信息:处理区号
    print(res2.group("nstart"))
    # 通过名称获取指定分组的信息:处理号码
    
    #输出:
    请输入:010-6612345
    <_sre.SRE_Match object; span=(0, 11), match='010-6612345'>
    010-6612345
    010
    
    

    2.9 正则表达式中的特殊用法

    表达式 描述
    (?:expression) 作为正则表达式的一部分,但是匹配结果丢弃
    (?=expression) 匹配expression表达式前面的字符,如 "How are you doing" ,正则"(?<txt>.+(?=ing))" 这里取ing前所有的字符,并定义了一个捕获分组名字为 "txt" 而"txt"这个组里的值为"How are you do"
    (?<=expression) 匹配expression表达式后面的字符,如 "How are you doing" 正则"(?<txt>(?<=How).+)" 这里取"How"之后所有的字符,并定义了一个捕获分组名字为 "txt" 而"txt"这个组里的值为" are you doing";
    (?!expression) 匹配字符串后面不是expression表达式字符,如 "123abc" 正则 "\d{3}(?!\d)"匹配3位数字后非数字的结果
    (?<!expression) 匹配字符串前面不是expression表达式字符,如 "abc123 " 正则 "(?<![0-9])123" 匹配"123"前面是非数字的结果也可写成"(?!<\d)123"

    2.10 正则表达式的贪婪模式和懒惰模式

    2.10.1 贪婪模式

    正则表达式匹配的一种模式,速度快,但是匹配的内容会从字符串两头向中间搜索匹配,一旦匹配选中,就不继续向字符串中间搜索了。

    2.10.2 懒惰模式

    正则表达式,会首先搜索匹配正则表达式开始位置的字符,然后逐步向字符串的结束位置查找,一旦找到匹配的就返回,然后接着查找

    相关文章

      网友评论

          本文标题:正则表达式

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