zoukankan      html  css  js  c++  java
  • re模块--高级用法

    re.search函数会在字符串内查找模式匹配,只要找到第一个匹配然后返回,如果字符串没有匹配,则返回None。

    格式:re.search(pattern, string, flags=0)

    需求:匹配出文章阅读的次数

    #coding=utf-8
    import re
    
    ret = re.search(r"d+", "阅读次数为 9999")
    ret.group()
    

    运行结果:

    '9999'
    

    match()和search()的区别:

    match()函数只检测RE是不是在string的开始位置匹配,search()会扫描整个string查找匹配;

    也就是说match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就返回none。

    如:print(re.match(‘super’, ‘superstition’).span()) 会返回(0, 5)

    ​ print(re.match(‘super’, ‘insuperable’)) 则返回None

    如:print(re.search(‘super’, ‘superstition’).span())返回(0, 5)

    ​ print(re.search(‘super’, ‘insuperable’).span())返回(2, 7)

    2、findall

    re.findall遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表。

    格式:re.findall(pattern, string, flags=0)

    需求:统计出python、c、c++相应文章阅读的次数

    #coding=utf-8
    import re
    
    ret = re.findall(r"d+", "阅读次数:9999次,转发次数:883次,评论次数:3次")
    print(ret)
    

    运行结果:

    ['9999', '883', '3']
    

    3、sub 将匹配到的数据进行替换

    使用re替换string中每一个匹配的子串后返回替换后的字符串。

    格式:re.sub(pattern, repl, string, count)

    需求:将匹配到的阅读次数加1

    方法1:

    #coding=utf-8
    import re
    
    ret = re.sub(r"d+", "10000", "阅读次数:9999次,转发次数:883次,评论次数:3次")
    print(ret)
    

    运行结果:

    阅读次数:10000次,转发次数:10000次,评论次数:10000次
    

    方法2:

    #coding=utf-8
    import re
    
    def add(temp):
        strNum = temp.group()
        num = int(strNum) + 1
        return str(num)
    
    ret = re.sub(r"d+", add, "python = 997")
    print(ret)
    
    ret = re.sub(r"d+", add, "python = 99")
    print(ret)
    

    运行结果:

    python = 998
    python = 100

    4、split 根据匹配进行切割字符串,并返回一个列表

    按照能够匹配的子串将string分割后返回列表。

    可以使用re.split来分割字符串,如:re.split(r's+', text);将字符串按空格分割成一个单词列表。

    格式:re.split(pattern, string[, maxsplit])

    需求:切割字符串“info:xiaoZhang 33 shandong”

    #coding=utf-8
    import re
    
    ret = re.split(r":| ","info:xiaoZhang 33 shandong")
    print(ret)
    

    运行结果:

    ['info', 'xiaoZhang', '33', 'shandong']

    5、python贪婪和非贪婪

    Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;

    非贪婪则相反,总是尝试匹配尽可能少的字符。

    在"*","?","+","{m,n}"后面加上?,使贪婪变成非贪婪。

    import re
    
    # 匹配多个数字
    result = re.match(r"aaa(d+)", "aaa123456")
    if result:
        print(result.group())
    else:
        print("匹配失败~!")
    

    匹配的结果:

    aaa123456

    解决方式:非贪婪操作符“?”,这个操作符可以用在"*","+","?"的后面,要求正则匹配的越少越好。

    # 匹配多个数字
    result = re.match(r"aaa(d+?)", "aaa123456")
    if result:
        print(result.group())
    else:
        print("匹配失败~!")
    

    运行结果:

    aaa1

    6、r的作用

    >>> mm = "c:\a\b\c"
    >>> mm
    'c:\a\b\c'
    >>> print(mm)
    c:ac
    >>> re.match("c:\\",mm).group()
    'c:\'
    >>> ret = re.match("c:\\",mm).group()
    >>> print(ret)
    c:
    >>> ret = re.match("c:\\a",mm).group()
    >>> print(ret)
    c:a
    >>> ret = re.match(r"c:\a",mm).group()
    >>> print(ret)
    c:a
    >>> ret = re.match(r"c:a",mm).group()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'NoneType' object has no attribute 'group'
    >>>
    

    说明

    Python中字符串前面加上 r 表示原生字符串

    与大多数编程语言相同,正则表达式里使用""作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。

    Python里的原生字符串很好地解决了这个问题,有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。

    >>> ret = re.match(r"c:\a",mm).group()
    >>> print(ret)
    c:a
     
  • 相关阅读:
    什么是递归神经网络
    2020年蜂窝网络连接超过110亿台设备
    伊朗Cisco路由器遭黑客攻击 全国互联网几乎瘫痪
    看了才知道!伊朗黑客组织原来这么牛
    美国知名Cloudflare网络公司遭中国顶尖黑客攻击
    如何对Web服务器进行飓风级防御
    美国的科技公司是如何使用加密的DNS
    揭秘网络黑客常见的6种必用攻击手段
    物联网是什么?您的家用电器从黑客手中安全吗
    不可不知!设置什么密码才不易被黑客破解
  • 原文地址:https://www.cnblogs.com/yu110812/p/9487729.html
Copyright © 2011-2022 走看看