Python 正则 RE day1.5

match对象

属性

  • pos : 目标字符串的开头位置 
  • endpos : 目标字符串结束位置 
  • re : 正则表达式对象 
  • string : 目标字符串 
  • lastgroup:最后一组名字 
  • lastindex:最后一组是第几组
     

属性方法

  • span() 获取匹配到的内容的起止位置
  • start() 获取匹配到的内容的开始位置 
  • end() 获取匹配到的内容的结束位置 
     
  • group(n = 0) 
    • 功能: 获取match对象对应匹配到的内容 
      参数: 默认为0表示获取正则表达式整体的匹配内容 
      如果赋值1,2,3…则表示获取某个子组的匹配内容 
      返回值:返回匹配字符串
  • groups() 获取所有子组匹配到的内容,形成一个元组
  • groupdict() 获取所有捕获组匹配内容,形成一个字典
    import re 
    
    pattern = r'(?P<dog>ab)cd(?P<pig>ef)'
    regex = re.compile(pattern)
    
    #获取match对象
    obj = regex.search("abcdefghijklmn",0,8)
    
    #match对象属性
    print(obj.pos)  #目标字符串的起始位置
    print(obj.endpos) #目标字符串的结束位置
    print(obj.re)    #正则表达式
    print(obj.string)  #目标字符串
    print(obj.lastgroup)  #最后一组的名称
    print(obj.lastindex) #最后一组是第几组
    
    print("====================================\n")
    
    print(obj.span())   # 匹配到内容的起止位置
    print(obj.start())  # 匹配到内容的开始位置
    print(obj.end())    # 匹配到内容的结束位置
    
    print(obj.group())
    print(obj.group(2))
    
    print(obj.groups())  #所有子组匹配内容
    print(obj.groupdict())  #捕获组字典
    
    #打印结果如下
    0
    8
    re.compile('(?P<dog>ab)cd(?P<pig>ef)')
    abcdefghijklmn
    pig
    2
    ====================================
    
    (0, 6)
    0
    6
    abcdef
    ef
    ('ab', 'ef')
    {'dog': 'ab', 'pig': 'ef'}
    

flags参数

  • re.compile re.findall re.search re.match  re.finditer re.fullmatch re.sub re.subn re.split
  • 作用:辅助正则表达式,扩展丰富匹配内容
  • I == IGNORECASE 忽略字母大小写 
    import re 
    
    regex = re.compile(r'hello',re.I)
    
    l = regex.findall('hello Hello')
    print(l)  #['hello', 'Hello']
    
  • S == DOTALL 元字符.可以匹配\n 
    import re 
    
    regex = re.compile(r'hello',re.I)
    
    
    
    s = '''hello world
    nihao Beijing'''
    
    l = re.findall(r'.+',s)
    print(l)
    l = re.findall(r'.+',s,re.S)
    print(l)
    
    
    #['hello world', 'nihao Beijing']
    #['hello world\nnihao Beijing']
    
  • M == MULTILINE 元字符 ^  $能匹配每一行的开头结尾
    import re 
    
    
    s = '''hello world
    nihao Beijing'''
    
    obj = re.search(r"world$",s,re.M)
    print(obj.group())
    
    
    #匹配每一行的结尾或者开头
  • X == VERBOSE 可以给正则添加注释
    import re 
    
    regex = re.compile(r'hello',re.I)
    
    
    pattern = r"""(?P<dog>\w+)  #dog组
    \s+   #匹配任意多个空格
    (\W+)  #匹配一些特殊字符
    """
    #添加注释同时忽略大小写
    s = re.match(pattern,'hello  %#@',re.X | re.I).group()
    print(s)
    
    #hello  %#@

同时使用多个flag 用 | 
re.I | re.S

要求:

  1. 编写一个程序接口,通过传入端口名称可以获取地址信息
  2. 文档特征:每个端口占一段,每段之间有空行,端口名称为每段的首个单词
    文档点击查看
    解析:
    import re 
    import sys 
    
    def getAddress(port):
        f = open('1.txt')
        while True:
            data = ''
            #获取每一段内容
            for line in f:
                if line != '\n':
                    data += line
                else:
                    break
            #文件结尾跳出循环
            if not data:
                break
            #匹配到每段的首个单词
            PORT = re.match(r'\S+',data).group()
            #判断是否为目标段
            if PORT == port:
                pattern = r'address is (\w{4}\.\w{4}\.\w{4})'
                addr = re.search(pattern,data).group(1)
                return addr
    
    if __name__ == "__main__":
        port = sys.argv[1]
        print(getAddress(port))

猜你喜欢

转载自blog.csdn.net/qq_42584444/article/details/82012016
今日推荐