zoukankan      html  css  js  c++  java
  • re模块和正则表达式

    一、正则表达式:

      官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

      在线测试工具:http://tool.oschina.net/regex/  

      方法规则:

      1、字符组

      2、字符

      3、量词

    字符
    . 匹配除换行符以外的任意字符
    w 匹配字母或数字或下划线符
    s 匹配空格符
    d 匹配数字符
    W 匹配非字母或数字或下划线符
    S 匹配非空格符
    D 匹配非数字符
    匹配换行符
    匹配制表符(tab)
     匹配一个单词的结尾
    ^ 匹配字符串的开头字符  
    $ 匹配字符串的结尾字符
    a|b 匹配字符a或字符b,长字符放前面
    () 匹配括号内的表达式,也可以表示一个组
    [...] 匹配字符组中的字符
    [^...] 匹配非字符组内以外的所有字符
    字符组
    正则 待匹配结果 匹配结果 说明
    [0123456789] 8 True
    在一个字符组里枚举合法的所有字符,字符组里的任意一个字符
    和"待匹配字符"相同都视为可以匹配
    [0123456789] a False
    由于字符组中没有"a"字符,所以不能匹配
    [0-9] 7 True
    也可以用-表示范围,[0-9]就和[0123456789]是一个意思
    [a-z] s True
    同样的如果要匹配所有的小写字母,直接用[a-z]就可以表示
    [A-Z] B True
    [A-Z]就表示所有的大写字母
    [0-9a-fA-F] e True
    可以匹配数字,大小写形式的a~f,用来验证十六进制字符
    量词 用法说明 注意
    * 重复零次或更多次 默认贪婪匹配,后面加?变惰性匹配
    + 重复一次或更多次 默认贪婪匹配,后面加?变惰性匹配
    重复零次或一次  
    {n} 重复n次 添加内容ps:加表示转义
    {n,} 重复n次或更多次 在字符串前加r,正则不转义
    {n,m} 重复n到m次  

      特点:

        1、^与$符连用,会精准限制匹配的内容,两者中间些什么,匹配的字符串就必须啥,无多勿少

        2、正则在匹配的时候哦默认贪婪匹配,可以在量词后面加?,转成惰性匹配

        3、量词必须跟在正则符号的后面,且量词只能够跟限制紧挨着它的哪一个正则符号

    二、正则和re模块关系:

      1、正则表达式不是python独有,它是一门独立的技术

      所有编程语言都可以使用正则

      但是如在python中使用,就必须依赖re模块

      2、在python应用场景:

        1.爬虫

        2.数据分析

      3、用法:

        先调用 import re

        1、re.findall

    res = re.findall('[a-z]+','eva egon jason')
    # findall('正则表达式','带匹配的字符串')
    print(res)  # 输出 ['eva', 'egon', 'jason']
    # 找出字符串中符合正则表达式全部内容 并且返回的是一个列表,列表中的元素就是正则匹配到的结果

        忽略分组有限机制

    ret1 = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
    ret2 = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')  # 忽略分组优先的机制
    print(ret1,ret2)  # ['oldboy']     这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可

       2、re.search     一般用if判断取值连用

    res = re.search('a','eva egon jason')
    print(res)  # search不会给你直接返回匹配到的结果 而是给你返回一个对象
    print(res.group())  # 必须调用group才能看到匹配到的结果
    '''
    输出结果
    <_sre.SRE_Match object; span=(2, 3), match='a'>
    a
    '''
    注意:
    1.search只会依据正则查一次 只要查到了结果 就不会再往后查找
    2.当查找的结果不存在的情况下 调用group直接报错

       3、re.match

    res = re.match('a','eva egon jason')
    print(res)
    print(res.group())
    """
    注意:
        1.match只会匹配字符串的开头部分
        2.当字符串的开头不符合匹配规则的情况下 返回的也是None 调用group也会报错
    """

       4、re.split

    ret = re.split('[ab]', 'abcd')  # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
    print(ret)  # ['', '', 'cd'] 返回的还是列表

       

    ret=re.split("d+","eva3egon4yuan")
    print(ret) #结果 : ['eva', 'egon', 'yuan']
    
    ret1=re.split("(d+)","eva3egon4yuan")
    print(ret1) #结果 : ['eva', '3', 'egon', '4', 'yuan']

       5、re.sub / re.subn

    ret = re.sub('d', 'H', 'eva3egon4yuan4',1)  # 将数字替换成'H',参数1表示只替换1个
    # sub('正则表达式','新的内容','待替换的字符串',n)
    """
    先按照正则表达式查找所有符合该表达式的内容 统一替换成'新的内容'  还可以通过n来控制替换的个数
    """
    print(ret)  # evaHegon4yuan4
    
    ret = re.subn('d', 'H', 'eva3egon4yuan4')  # 将数字替换成'H',返回元组(替换的结果,替换了多少次)
    ret1 = re.subn('d', 'H', 'eva3egon4yuan4',1)  # 将数字替换成'H',返回元组(替换的结果,替换了多少次)
    print(ret,ret1)  # 返回的是一个元组 元组的第二个元素代表的是替换的个数
    #('evaHegonHyuanH', 3),('evaHegon4yuan4', 1)    

       6、re.compile

    obj = re.compile('d{3}')  #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
    ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串
    res1 = obj.findall('347982734729349827384')
    print(ret.group())  #结果 : 123
    print(res1)  #结果 : ['347', '982', '734', '729', '349', '827', '384']

       7、re.finditer

    import re
    ret = re.finditer('d', 'ds3sy4784a')   #finditer返回一个存放匹配结果的迭代器
    print(ret)  # <callable_iterator object at 0x10195f940>
    print(next(ret).group())  # 等价于ret.__next__()
    
    print([i.group() for i in ret])  #可查看剩余的左右结果

       8、可以给正则表达式起别名

    import re
    res = re.search('^[1-9](d{14})(d{2}[0-9x])?$','110105199812067023')
    # 还可以给某一个正则表达式起别名
    
    res1 = re.search('^[1-9](?P<password>d{14})(?P<username>d{2}[0-9x])?$','110105199812067023')
    # print(res.group())
    print(res1.group('password'))  # 等于 print(res1.group(1))
    print(res1.group('username')) # 等于print(res1.group(2))
  • 相关阅读:
    重构之重新组织函数(Split Temporary Variable)
    HammperSpoon 不能 Focus Google Chrome 的问题
    如何让 vim 可以在命令行执行命令并且附加参数
    This bison version is not supported for regeneration of the Zend/PHP parsers
    php cURL library is not loaded
    aws linuxbrew GLIBC_PRIVATE not defined in file ld-linux-x86-64.so.2
    gen-cpp/.deps/ChildService.Plo: No such file or directory
    快速解码base64和utf-8的ASCII编码和URL解码
    英文版firefox显示中文字体丑的问题
    linux find 反转 查找没有被找到的结果
  • 原文地址:https://www.cnblogs.com/xiaowangba9494/p/11202857.html
Copyright © 2011-2022 走看看