开发者

Python全栈之路正则函数

目录
  • 1. 反向引用_命名分组
  • 2. 正则函数
    • 小提示:编程客栈
  • 总结

    1. 反向引用_命名分组

    # ### 反向引用
    import re
    strvar = "<div>明天又要休息了</div>"
    obj = re.search("<(.*?)>(.*?)<(.*?)>",strvar)
    print(obj)
    # 获取匹配到的内容
    res1 = obj.group()
    print(r编程客栈es1)
    # 获取分组里的内容
    res2 = obj.groups()
    print(res2)
    # 反向引用的语法 \1把第一个括号里面匹配到的内容在引用一次
    obj = re.search(r"<(.*?)>(.*?)</\1>",strvar)
    print(obj)
    print(obj.group())
    print(obj.groups())
    strvar = " z3d4pzd a1b2cab "
    obj = re.search(r"(.*?)\d(.*?)\d(.*?)\1\2",strvar)
    print(obj)
    print(obj.group())
    print(obj.groups())
    # ### 命名分组
    """
    3) (?P<组名>正则表达式) 给这个组起一个名字
    4) (?P=组名) 引用之前组的名字,把该组名匹配到的内容放到当前位置
    """
    # 写法一
    strvar = " z3d4pzd a1b2cab "
    obj = re.search(r"(?P<tag1>.*?)\d(?P<tag2>.*?)\d(?P<tag3>.*?)\1\2",strvar)
    print(obj)
    print(obj.group())
    # 写法二
    strvar = " z3d4pzd a1b2cab "
    obj = re.search(r"(?P<tag1>.*?)\d(?P<tag2>.*?)\d(?P<tag3>.*?)(?P=tag1)(?P=tag2)",strvar)
    print(obj)
    print(obj.group())
    

    2. 正则函数

    # ### 正则函数
    import re
    # search   通过正则匹配出第一个对象返回,通过group取出对象中的值
    strvar = "3+4 6*4"
    obj = re.search(r"(\d+[+*]\d+)",strvar)
    print(obj)
    # 获取匹配http://www.cppcns.com到的内容
    print(obj.group())
    # 获取分组当中的内容 (返回元组)
    print(obj.groups())
    # match    验证用户输入内容 (了解)
    """search在正则表达式的前面加上^ 等价于 match ,其他用法上一模一样"""
    strvar = "a17366668888"
    strvar = "17366668888"
    # obj = re.search(r"^\d+",strvar)
    # obj = re.match(r"\d+",strvar)
    # print(obj.group())
    print(obj)
    # split    切割
    strvar = "alex|wusir_xboyww@risky"
    lst = re.split("[|_@]",strvar)
    print(lst)
    strvar = "alex2341273894wusir234234xboyww11111risky"
    lst = re.split("\d+",strvar)
    print(lst)
    # sub      替换 
    strvar = "alex|wusir_xboyww@risky"
    """
    strvar = strvar.replace("|","&")
    strvar = strvar.replace("_","&")
    strvar = strvar.replace("@","&")
    print(strvar)
    """
    # sub(正则,替换的字符,原字符串[,替换的次数])
    res = re.sub("[|_@]","&",strvar)
    res = re.sub("[|_@]","&",strvar,1)
    print(res)
    # subn     替换  (用法上与sub相同,只是返回值不同)
    res = re.subn("[|_@]","&",strvar)
    res = re.subn("[|_@]","&",strvar,2)
    print(res) 
    # res = re.sub("[|_@]","&",strvar)
    # ('alex&wusir&xboyww@risky', 2)
    # finditer 匹配字符串中相应内容,返回迭代器
    """返回的是迭代器,迭代器中包含了对象 对象.group来获取匹配到的值"""
    from collections import Iterator, Iterable
    strvar = "sdf23647fdgdfg()*()*23423423"
    it = re.finditer("\d+",strvar)
    print(isinstance(it,Iterator))
    for obj in it:
    	print(obj.group())
    # compile  指定一个统一的匹配规则
    """
    正常情况下,正则表达式编译一次,执行一次
    为了避免反复编译,节省时间空间,可以使用compile统一规则
    编译一次,终身受益
    """
    strvar = "asdfs234sdf234"
    pattern = re.compile("\d+")
    print("<===>")
    obj = pattern.search(strvar)
    print(obj.group())
    lst = pattern.findall(strvar)
    print(lst)
    # 修饰符 
    # re.I 使匹配对大小写不敏感
    strvar = "<h1>大标题</H1>"
    pattern = re.compile("<h1>(.*?)</h1>" , flags=re.I)
    obj = patter编程客栈n.search(strvar)
    print(obj.group())
    # re.M 使每一行都能够单独匹配(多行匹配),影响 ^ 和 $
    """单行独立匹配,而不是整体匹配"""
    strvar = """
    <p>111&编程客栈lt;/p>
    <a>222</a>
    <strong>333</strong>
    """
    pattern = re.compile("^<.*?>(?:.*?)<.*?>$" , flags=re.M)
    lst = pattern.findall(strvar)
    print(lst)
    # re.S 使 . 匹配包括换行在内的所有字符
    strvar = """
    give
    sdfsdfmefive
    """
    # 多个修饰符一起使用通过|拼接
    pattern = re.compile(".*?mefive" , flags = re.S|re.I|re.M )
    obj = pattern.search(strvar)
    print(obj.group())
    

    小提示:

    爬虫爬数据的时候用finditer,数据太大,用迭代器存
    strvar = """
    <p>111</p>
    <a>222</a>
    <strong>333</strong>
    """
    pattern = re.compile("^<.*?>(?:.*?)<.*?>$")
    lst = pattern.findall(strvar)
    print(lst) # 这里的结果为[] 因为.不匹配换行符,所以不会返回结果
    pattern = re.compile("^<.*?>(?:.*?)<.*?>$",flags=re.M) 这里就是
    一行的一行的匹配了
    不会用for i in找思路 
    不会用.*?找思路
    

    总结

    本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜