python的正则表达式

作者: 烂笔头2020 | 来源:发表于2020-05-19 14:41 被阅读0次

    在python爬虫解析网页这部分中,有3个方法,其中一个就是python的正则表达式,虽然python的bs4库可以做到一个简单的解析,不过在网页数据比较大的时候运行速度会慢很多,所以今天就来学习一下python正则表达式,除了在爬虫的时候可以用到,在其他很多的地方也可以用上。

    1、re.match函数

    re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
    re.match(pattern, string, flags=0)

    # -*- encoding: utf-8 -*-
    import re
    print(re.match('www', 'www.runoob.com').span())  # 在起始位置匹配
    print(re.match('com', 'www.runoob.com'))         # 不在起始位置匹配
    
    #结果
    #(0, 3)
    #None
    
    2、re.search方法

    扫描整个字符串并返回第一个成功的匹配。
    re.search(pattern, string, flags=0)

    #!/usr/bin/python
    # -*- coding: UTF-8 -*- 
     
    import re
    print(re.search('www', 'www.runoob.com').span())  # 在起始位置匹配
    print(re.search('com', 'www.runoob.com').span())         # 不在起始位置匹配
    #结果
    #(0, 3)
    #(11, 14)
    

    re.match与re.search的区别
    re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

    3、re.sub方法

    用于替换字符串中的匹配项。
    re.sub(pattern, repl, string, count=0, flags=0)
    pattern : 正则中的模式字符串。
    repl : 替换的字符串,也可为一个函数。
    string : 要被查找替换的原始字符串。
    count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
     
    import re
     
    phone = "2004-959-559 # 这是一个国外电话号码"
     
    # 删除字符串中的 Python注释 
    num = re.sub(r'#.*$', "", phone)
    print "电话号码是: ", num
     
    # 删除非数字(-)的字符串 
    num = re.sub(r'\D', "", phone)
    print "电话号码是 : ", num
    
    #结果
    #电话号码是:  2004-959-559
    #电话号码是 :  2004959559
    
    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
     
    import re
     
    # 将匹配的数字乘以 2
    def double(matched):
        value = int(matched.group('value'))
        return str(value * 2)
     
    s = 'A23G4HFD567'
    print(re.sub('(?P<value>\d+)', double, s))
    
    #结果
    #A46G8HFD1134
    
    4、re.compile 函数

    compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
    语法格式为:re.compile(pattern[, flags])
    参数:
    pattern : 一个字符串形式的正则表达式
    flags : 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
    re.I 忽略大小写
    re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
    re.M 多行模式
    re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符)
    re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
    re.X 为了增加可读性,忽略空格和 # 后面的注释

    >>>import re
    >>> pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I)   # re.I 表示忽略大小写
    >>> m = pattern.match('Hello World Wide Web')
    >>> print m                               # 匹配成功,返回一个 Match 对象
    <_sre.SRE_Match object at 0x10bea83e8>
    >>> m.group(0)                            # 返回匹配成功的整个子串
    'Hello World'
    
    5、findall

    在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
    注意: match 和 search 是匹配一次 findall 匹配所有。
    语法格式为:findall(string[, pos[, endpos]])

    # -*- coding:UTF8 -*-
     
    import re
     
    pattern = re.compile(r'\d+')   # 查找数字
    result1 = pattern.findall('runoob 123 google 456')
    result2 = pattern.findall('run88oob123google456', 0, 10)
     
    print(result1)
    print(result2)
    
    #结果
    #['123', '456']
    #['88', '12']
    
    
    6、re.finditer

    和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。

    # -*- coding: UTF-8 -*-
     
    import re
     
    it = re.finditer(r"\d+","12a32bc43jf3") 
    for match in it: 
        print (match.group() )
    
    #结果
    12 
    32 
    43 
    3
    

    相关文章

      网友评论

        本文标题:python的正则表达式

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