zoukankan      html  css  js  c++  java
  • python得re模块

    1. re模块使用格式

    import re   # 导入模块

    查找,验证:

    re.search(rule,string)    # 如果没有匹配结果返回None,如果有结果返回一个结果集,用.group()获取结果, .span()获取内容索引位置,特点是找到即返回

    re.findall(rule,string)     # 如果没有匹配结果返回一个空列表,如果有结果返回一个列表存放所有匹配到的内容

    re.match()    # 只是规则前加了^,用search可以替代

    替换,切割:

    re.sub(rule,repl,string,count=0)    # 替换string里匹配到的内容,默认全部替换,可以指定替换次数,返回一个字符串

    re.subn(rule,repl,string,count=0)   # 替换string里匹配到的内容,默认全部替换,可指定次数,返回一个元祖,第一位为替换后的字符串,第二位为替换次数

    re.split(rule,string,maxsplit=0)   # 以规则切割string,可指定切割次数,如果没有匹配到内容返回一个内容的列表

    提前定制规则:

    场合:用在需要重复用到同一个规则时候,提前编译可以节省时间,提高效率

    rule = re.compile(rule)  # 提前编译

    rule.search(string)   # 使用提前编译的规则进行search

    匹配到内容生成一个迭代器:

    场合:在提取到大量数据时候,不会担心内存溢出,节省内存空间

    finditer(rule,string)   # 得到的是一个结果集,需要.group()取值,.span()取索引范围

    1.2使用分组:

    findall():

    注: findall()默认加分组会优先提取括号内的内容

    import re
    msg = r"""
    # <h1>hahaha<h1>
    # <h2>wahaha<h2>
    # <title>qqxing<	itle>
    """
    ret = re.findall('>.+<',msg)   
    print(ret)
    # ['>hahaha<', '>wahaha<', '>qqxing<']
    print([i.strip('<>') for i in ret])  # 不加分组需要手动过滤一遍
    # ['hahaha', 'wahaha', 'qqxing']
    
    # 加分组更好用
    ret = re.findall('>(.+)<',msg)  # findall在加上分组后会优先提取括号的内容
    print(ret)
    # ['hahaha', 'wahaha', 'qqxing']

    取消分组:   (?: )

    ret = re.findall('>(?:.+)<',msg)

    search() :

    # 不会受到分组影响

    split():

    # 使用分组会保留分组的内容

    ret = re.split('(d+)','a123b456c678')
    print(ret)
    # ['a', '123', 'b', '456', 'c', '678', '']

    1.3分组命名

    可以很方便取到分组的内容。

    格式:(?P<变量名>)

    msg = r"""
    # <h1>hahaha<h1>
    # <h2>wahaha<h2>
    # <title>qqxing<	itle>
    """
    ret = re.search('<(?P<table>.+?)>(?P<content>.+?)<.+',msg)
    print(ret.group()) # <h1>hahaha<h1>
    print(ret.group('table'))  # h1
    print(ret.group('content'))  # hahaha

     group(1),group(2)取第一二分组内容:

    import re
    a = 'abc123efg456'
    ret = re.search('(?P<a>d+)(?P<b>w+)',a)
    print(ret.group(1))  # 123
    print(ret.group(2))  # efg456

    1.4匹配需要的内容:

    msg = r"""
    # <h1>hahaha<h1>
    # <h2>wahaha<h2>
    # <title>qqxing<	itle>
    """
    # 当遇到不想匹配到的内容,要把不需要和需要的都写出来,用分组把需要的取出
    ret = re.findall(r'<(.+?)>.+?<\.+>',msg)
    print(ret)
    # ['h1', 'h2', 'title']
    
    a = '1-2*(60+(-40.35/5)-(-4*3))'
    ret = re.findall('d+.d+|(d+)',a)
    ret.remove('')
    print(ret)
    # ['1', '2', '60', '5', '4', '3']

    1.5特殊需求

    msg = r"""
    <h1>hahaha<h1>
    <h2>wahaha<h2>
    <title>qqxing<	itle>
    """
    # 定义名称,相等匹配
    rule = '<(?P<table>).*>.*<(?P=table).*>'
    ret = re.search(rule,msg)
    if ret:
        print(ret.group())   # <h1>hahaha<h1>
    # 1匹配前个括号内容
    rule = r'<(.*)>.*<\1>'
    ret = re.search(rule,msg)
    if ret:
        print(ret.group())   # <h1>hahaha<h1>

    1.6 sub替换全部内容,复用括号里的内容

     // 表示sub正则匹配出来得内容(括号里的),通过g<1>可以复用

  • 相关阅读:
    编译安装 openmcu
    spring AOP
    spring 依赖注入
    maven项目无法新增java test目录的问题
    java 路径的问题
    使用httpClient模拟http请求
    java String 内存模型
    javaweb项目中的过滤器的使用
    javaweb+spring 项目集成异常的处理
    javaweb 项目的异常处理
  • 原文地址:https://www.cnblogs.com/zezhou/p/10578732.html
Copyright © 2011-2022 走看看